다음 쿼리는 매우 느리게 실행되며 예상 된 실행 계획을 사용하여 문제를 최종 INNER JOIN의 조건으로 좁혔습니다.INNER JOIN 또는 조건에 대한 쿼리 최적화
SELECT
TableE.id
FROM
TableA WITH (NOLOCK)
INNER JOIN TableB WITH (NOLOCK)
ON TableA.[bid] = TableB.[id]
LEFT JOIN TableC WITH (NOLOCK)
ON TableB.[cid] = TableC.[id]
LEFT JOIN TableD WITH (NOLOCK)
ON TableA.[did] = TableD.[id]
INNER JOIN TableE WITH (NOLOCK)
ON TableD.[eid] = TableE.[id]
OR TableE.[numericCol] = TableB.[numericCol] -- commenting out this OR statement leads to large performance increase
WHERE
TableA.[id] = @Id
나는이 TableB의에서 다음 인덱스 :
CREATE NONCLUSTERED INDEX [IX_TableE_numericCol] ON [dbo].[TableE]
(
[numericCol] ASC
)
어떤 아이디어 :
CREATE UNIQUE NONCLUSTERED INDEX [IX_TableB_numericCol_id] ON [dbo].[TableB]
(
[numericCol] ASC,
[id] ASC
)
및 TableE에
?
이 쿼리는 프로 시저에 있습니까? 그렇다면 매개 변수 스니핑을 살펴볼 수 있습니다. – Mihai
'TableB. [numericCol]'에 대한 색인이 있습니까? – Mihai
데이터 누락 및/또는 중복으로 멋지다면 실제로 NOLOCK 힌트로 데이터베이스를 낭비하지 않아야합니다. http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/11/10/1280.aspx –