【问题标题】:Optimize complicated query优化复杂查询
【发布时间】:2012-01-07 06:16:25
【问题描述】:

我有一个通过某个 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 是一个带有各种连接的临时表。

这个查询可以优化吗?

【问题讨论】:

  • 一天的第一单,需要优化吗?为什么对你来说太慢了?执行需要多长时间,是否会给您带来问题?我注意到的第一件事是您使用*。您需要选择每个 列吗?如果没有,请明确指定您想要的。
  • 将主题更改为:“SQL 101:优化琐碎查询”。如果这很复杂,当您第一次看到复杂的 4 页打印查询时,您的大脑可能会爆炸。
  • 这句话Where PagedOptionData is a temp table with various join . 是什么意思。这似乎没有意义。 PagedOptionData 是否定义为公用表表达式?如果是这样,请显示它的定义。

标签: c# tsql query-optimization


【解决方案1】:

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

有一点很突出:当您在同一张表上使用 SELECT * 两次时,如何消除列名中的歧义?

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

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

这大大简化了问题,但牺牲了客户端代码中的更多逻辑

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多