다음과 같은 두 가지 쿼리가 있습니다. 원본은 첫 번째이고 두 번째는 약간의 "업그레이드"입니다. 처음에는 손가락을 완전히 새로 고침 버튼을 누르기 전에 거의 1 초가 걸리고 두 번째 키는 끝납니다.쿼리 대 쿼리 - 왜 다른 쿼리보다 더 빠른 이유는 무엇입니까?
내 질문 : 이유가 무엇입니까?
첫 번째와 두 번째 유일한 차이점은 coalesce를 사용하여 berp.ID_PART_SESSION과 (과) 비교할 값을 얻고 두 번째는 같은 선택을하기 위해 두 개의 SELECT 문을 함께 사용하는 것입니다.
여전히 동일한 결과를 얻으려면 작업량이 적어 져야하므로 첫 번째 작업이 더 빨라야한다고 생각합니다 (원래 병합을 사용한 이유). 내가 실행 계획을 해독하는 방법이 약하다는 것을 고려해 보면 누군가 두 번째 쿼리가 첫 번째 쿼리보다 훨씬 나은 이유를 설명해 줄 수 있습니까?
declare @animator varchar
SELECT TOP 1 @animator = FULL_NAME
FROM T_BERP berp
INNER JOIN dbo.T_INTERV i ON i.ID_INTERV = berp.ID_INTERV
WHERE berp.VERSION = 1
AND berp.PRINCIPAL = 1
AND berp.DELETED = 0
AND berp.CANCELLED = 0
AND berp.ID_PART_SESSION = (
select coalesce(pss.ID_PART_SESSION, psst.ID_PART_SESSION)
from t_bersp b
LEFT JOIN T_PART_SESSION pss ON b.ID_PART_SESSION = pss.ID_PART_SESSION
LEFT JOIN T_PSS_TEMP psst ON b.ID_PSS_TEMP = psst.ID_PSS_TEMP
where ID_BERSP = 4040)
declare @animator varchar
SELECT TOP 1 @animator = FULL_NAME
FROM dbo.T_BERP berp
INNER JOIN dbo.T_INTERV i ON i.ID_INTERV = berp.ID_INTERV
WHERE berp.VERSION = 1
AND berp.PRINCIPAL = 1
AND berp.DELETED = 0
AND berp.CANCELLED = 0
AND berp.ID_PART_SESSION IN (
select pss.ID_PART_SESSION
from dbo.t_bersp b
LEFT JOIN dbo.T_PART_SESSION pss ON b.ID_PART_SESSION = pss.ID_PART_SESSION
where ID_BERSP = 4040
union
select psst.ID_PART_SESSION
from dbo.t_bersp b
LEFT JOIN dbo.T_PSS_TEMP psst ON b.ID_PSS_TEMP = psst.ID_PSS_TEMP
where ID_BERSP = 4040)
두 쿼리를 비교해야 할 때마다 일반적으로 [실행 계획이 어떻게 보이는지 확인하는] 쉬운 첫 단계입니다 (http://www.sql-server-performance.com/tips/query_execution_plan_analysis_p1.aspx). 일단 당신이 질문을하면 계획을 추가 할 것입니다. –
초기 생각은 맨 위의'='와 하위 쿼리의 맨 아래에있는 'IN' 이었지만 상관 관계가 없으므로 문제가 될 것이라고 생각하지 않습니다 ... – JNK
첫 번째 쿼리의 또 다른 차이점이 있습니다 '='를 사용하고 두 번째는 'IN'을 사용합니다. 또한 관련없는 경고로서, ORDER BY없이 TOP 1을 사용하면 버그를 추적하기가 매우 어려워 질 수 있습니다. 여러 레코드가 반환되는 순서는 주문하지 않은 경우 불확정합니다. 일반적으로 디스크의 인덱스 또는 물리적 순서의 정렬 순서와 일치하지만 보증은 없습니다. – Rozwel