相关疑难解决方法(0)

为什么添加 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
Run Code Online (Sandbox Code Playgroud)

这给了我可怕的表现(就像从不费心等待它完成一样)。查询计划如下所示:

在此处输入图片说明

但是,如果我删除它,TOP 1我会得到一个看起来像这样的计划,它会在 1-2 秒内运行:

在此处输入图片说明

下面更正 PK 和索引。

TOP 1更改查询计划这一事实并不让我感到惊讶,我只是有点惊讶它使情况变得更糟。

注意:我已经阅读了这篇文章的结果并理解了 aRow Goal等的概念。我很好奇的是如何更改查询以使其使用更好的计划。目前我正在将数据转储到临时表中,然后从中取出第一行。我想知道是否有更好的方法。

编辑对于事后阅读本文的人,这里有一些额外的信息。

  • Document_Queue - PK/CI 是 D_ID,它有大约 5k 行。
  • Correspondence_Journal - PK/CI 是 FILE_NUMBER,CORRESPONDENCE_ID,它有大约 140 万行。

当我开始时,没有其他索引。我在 Correspondence_Journal (Document_Id, File_Number) 上找到了一个

performance sql-server sql-server-2008-r2 query-performance performance-tuning

41
推荐指数
4
解决办法
1万
查看次数