나는 매우 간단한 질문이 있습니다
SELECT TOP 1 dc.DOCUMENT_ID,
dc.COPIES,
dc.REQUESTOR,
dc.D_ID,
cj.FILE_NUMBER
FROM DOCUMENT_QUEUE dc
JOIN CORRESPONDENCE_JOURNAL cj
ON dc.DOCUMENT_ID = cj.DOCUMENT_ID
WHERE dc.QUEUE_DATE <= GETDATE()
AND dc.PRINT_LOCATION = 2
ORDER BY cj.FILE_NUMBER
그것은 끔찍한 성능을 제공합니다 (완료 될 때까지 기다리지 않는 것처럼). 쿼리 계획은 다음과 같습니다.
그러나 내가 제거하면 TOP 1
다음과 같은 계획이 있으며 1-2 초 안에 실행됩니다.
아래의 올바른 PK 및 색인 생성.
(가) 사실 TOP 1
나를 놀라게하지 않는 쿼리 계획을 변경, 나는 단지 조금 그것이 훨씬 더 악화 놀라입니다.
참고 :이 게시물 의 결과를 읽고 Row Goal
등 의 개념을 이해했습니다 . 궁금한 점은 더 나은 계획을 사용하도록 쿼리를 변경하는 방법에 대해 궁금합니다. 현재 데이터를 임시 테이블에 덤프 한 다음 첫 번째 행을 가져옵니다. 더 좋은 방법이 있는지 궁금합니다.
편집 사실 여기에서 읽은 사람들에게는 몇 가지 추가 정보가 있습니다.
- Document_Queue-PK / CI는 D_ID이며 ~ 5k 개의 행이 있습니다.
- Correspondence_Journal-PK / CI는 FILE_NUMBER, CORRESPONDENCE_ID이며 ~ 1.4mil 행을 갖습니다.
내가 시작했을 때 다른 색인은 없었습니다. 나는 Correspondence_Journal (Document_Id, File_Number)에 하나가되었습니다.
DOCUMENT_ID
두 테이블 사이의 관계를 (또는 모든 레코드는 않습니다CORRESPONDENCE_JOURNAL
일치하는 레코드를을DOCUMENT_QUEUE
)?