6
为什么添加TOP 1会显着降低性能?
我有一个相当简单的查询 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 Goaletc 的概念。我很好奇的是如何去改变查询,以便它使用更好的计划。目前,我正在将数据转储到临时表中,然后从中提取第一行。我想知道是否有更好的方法。 编辑对于在事实结束后仍在阅读本文的人,这里还有一些其他信息。 Document_Queue-PK / CI是D_ID,它具有约5k行。 Correspondence_Journal-PK / CI为FILE_NUMBER,CORRESPONDENCE_ID,具有约140万行。 当我开始时,没有其他索引。我最后在Correspondence_Journal(Document_Id,File_Number)上写了一个