Product_order 테이블(주문정보) 과 Product_Porder 테이블(주문상품) 테이블이 있는데요
주문한 상품중에서 시금치 라는 상품을 검색한다고 하면
현재 B와 같은 쿼리로 결과값을 뽑는데요 속도가 느리다고 해서
A와 같은 쿼리로 변경을 해보고 Ctrl+L 로 해서 예상실행계획을 봤는데
A쿼리는 쿼리비용이 68%, B쿼리는 32%가 나왔습니다.
그런데 B쿼리는 쿼리분석기에서 실행을 해보면 1분 넘도록 결과값이 나오지 않는데
A쿼리는 1초도 안 되서 결과값이 나옵니다.
쿼리비용이 낮은게 무조건 좋은게 아닌가요?
A.
select top 10 * from Product_Order
where claim_state=0 and idx in (select order_idx from Product_Porder where p_name like '%시금치%')
order by idx desc
B.
select top 10 * from Product_Order a inner join Product_Porder b on a.idx=b.order_idx
where p_name like '%시금치%' and claim_state=0
order by a.idx desc
Comment 4
-
희망나라
2015.11.10 11:30
-
minsouk
2015.11.10 13:28
두개 쿼리의 드라이빙 테이블이 아마 틀릴듯 하네요, 드라이빙 혹은 아우터레퍼런스 테이블의 방향이나 physical join 이터레이터가 틀릴것으로 생각됩니다. 두 실행계획을 xml 로 잘 압축해서 올려주시면 해석에 도움을 좀 드릴수 있지 않을까요?
실행계획의 비용은 통계에 의해 구해지는 비용이므로 통계가 정확하지 않거나 통계를 잘 보지 못하도록 작성된 쿼리는 비용이 정확하지 않습니다. 예전에 병렬처리 level 400 unplugged 강좌에 잘 설명되어 있었는데, 지금은 동영상이 지워지고 없네요....아쉽네요~
-
냥냥
2015.11.10 16:16
실행계획표를 캡쳐해서 첨부했는데요.. A쿼리쪽에 비용이 88% 인게 Product_Porder 쪽에 시금치를 검색하는 쿼리이고 B쿼리쪽의
비용이 100% 인 쿼리가 시금치를 검색하는 쿼리입니다.
시금치를 검색하는 쿼리가 속도가 너무 느리다보니 그런게 아닐까 라는 저의 생각..
맞을까요...^^;
-
minsouk
2015.11.10 18:13
1. 비용과 처리시간은 별개의 문제 입니다. sql 은 병렬처리가 되니까요
2. 또 이런 병렬처리를 이해 하려면 암달의 법칙이나 뭐 이런 기본적인 병렬처리에 대한 개념이 있어야 합니다.
3. 플랜 올리실때는요~ xml 로 받아서 zip 으로 올리는게 좋습니다.
4. 테이블 이름 그대로 올려주세요~ 바꿀려면 xml 내에서도 가 같이 바꾸어 주세요~(그냥 올리는게 가장 좋습니다.)
5. 드라이빙 방향이 틀리죠? 잘 보세요 테이블이 위에 있는것과 아래 있는게 틀립니다.
6. 그건 그렇구요 xml 이 아니라서 뭐라 말씀 못 드리겠습니다.
7. 실제 실행계획과 set statistics io, profile, time on 이렇게 이 정보도 같이 첨부파일로 압축해 주셔야 유추 할 수 있습니다. 가장 좋은건 두개를 돌릴때 프로파일러 정보를 떠 주는 것 입니다.
저도 여기서 지식을 얻어가는 초보라 참고만 하시길 바랍니다.
A 는 where 조건으로 걸러진 것만 Product_Order 에서 조회되고
B.는 셀프조인 하는데 Product_Order a 가 where 조건으로 걸리므로 일단 테이블이 풀스켄 될것이고
이후에 다시 Product_Porder b와 조인하므로 A보다 느린걸로 보여집니다.
실행계획표는 참고용이지 절대적인 건 아니라고 생각합니다.