优化复杂的查询

时间:2011-11-27 10:11:06

标签: c# tsql query-optimization

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

可以优化此查询吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

这大大简化了事务,代价是客户端代码中的逻辑更多

答案 1 :(得分:2)

查询看起来并不复杂,因此如果运行缓慢,则应通过添加索引来完成优化。 Sql Server可以建议添加索引。

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