我有一个相当简单的查询
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
etc 的概念。我很好奇的是如何去改变查询,以便它使用更好的计划。目前,我正在将数据转储到临时表中,然后从中提取第一行。我想知道是否有更好的方法。
编辑对于在事实结束后仍在阅读本文的人,这里还有一些其他信息。
- Document_Queue-PK / CI是D_ID,它具有约5k行。
- Correspondence_Journal-PK / CI为FILE_NUMBER,CORRESPONDENCE_ID,具有约140万行。
当我开始时,没有其他索引。我最后在Correspondence_Journal(Document_Id,File_Number)上写了一个
DOCUMENT_ID
两个表之间的关系(或中的每个记录在中CORRESPONDENCE_JOURNAL
都有匹配的记录DOCUMENT_QUEUE
)?