私はかなり単純なクエリを持っています
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
クエリプランが変更されたからといって驚くことはありませんが、それによって事態がさらに悪化していることに少し驚いています。
注:この投稿の結果を読んで、a Row Goal
などの概念を理解しています。私が興味を持っているのは、より良いプランを使用するようにクエリを変更する方法です。現在、データを一時テーブルにダンプしてから、最初の行を取り出しています。より良い方法があるかどうか疑問に思っています。
編集事実の後にこれを読んでいる人々のために、ここにいくつかの追加情報があります。
- Document_Queue-PK / CIはD_IDであり、〜5k行があります。
- Correspondence_Journal-PK / CIはFILE_NUMBER、CORRESPONDENCE_IDで、行数は約140万です。
私が始めたとき、他のインデックスはありませんでした。私はCorrespondence_Journal(Document_Id、File_Number)で1つになりました
DOCUMENT_ID
2つのテーブル間の関係を強制する外部キー制約がありますか(またはすべてのレコードににCORRESPONDENCE_JOURNAL
一致するレコードがありDOCUMENT_QUEUE
ますか)?