优化复杂查询

本文关键字:查询 复杂 优化 | 更新日期: 2023-09-27 18:15:47

我有一个查询,合并表的一些id。

SELECT ROW_NUMBER() OVER (ORDER BY PagedOptionData1.ExternalId ASC,
                                   PagedOptionData1.RunDateTime DESC
                          ) AS RowNumber,
       PagedOptionData1.*,
       PagedOptionData2.*
FROM   PagedOptionData AS PagedOptionData1
       LEFT OUTER JOIN PagedOptionData AS PagedOptionData2
         ON PagedOptionData1.ExternalId = PagedOptionData2.ExternalId
            AND PagedOptionData2.rn = 2
WHERE  PagedOptionData1.rn = 1  

其中PagedOptionData是一个具有各种连接的临时表

这个查询可以优化吗?

优化复杂查询

无论您使用原始表单还是我的建议,您都需要(ExternalId ASC, RunDateTime DESC)的索引

有一件事很突出:当你在同一个表上两次使用SELECT *时,你将如何消除列名中的歧义?

为了避免顺序列访问并简化查询,我考虑重写:

SELECT TOP 2
   *
FROM
   PagedOptionData
ORDER BY
   ExternalId ASC, RunDateTime DESC

这大大简化了问题,代价是在客户端代码中增加了更多的逻辑

查询看起来不是很复杂,所以如果它运行缓慢,应该通过添加索引来进行优化。Sql Server可以建议添加索引

  1. 将查询粘贴到新的Sql Management Studio窗口中。
  2. 点击工具栏中的"包含实际执行计划"按钮。
  3. 执行查询。
  4. 检查返回的执行计划是否有索引建议(在查询的正下方以绿色文本显示)。
  5. 创建索引并重试。