【问题标题】:Slow query on view when using single column order by clause使用单列 order by 子句时视图查询慢
【发布时间】:2012-07-06 13:00:38
【问题描述】:

我有一个连接 24 个表(除了 1 个是左外连接)和 83 列的视图。当我从没有 order by 子句的视图中选择 * 时,它会在大约 4:27 秒内返回 27k 行所有列。如果我执行相同的选择但添加了“order by requestId”子句,则需要 83 分钟才能完成。 被排序的列在原始表中被索引。

我尝试按 requestId 将它包装在 Select * from (.......) 顺序中,但得到相同的结果。

关于去哪里的建议

【问题讨论】:

  • 这个特定的查询真的需要来自所有 24 个表的列吗?也许您应该考虑针对基表编写有针对性的查询,而不是从超级视图中继承所有噪音。
  • 不幸的是,它确实如此,返回的数据被导出到 excel 中以供进一步分析。
  • 好吧,我想看看执行计划,但我担心他们会让我做噩梦。 :-(
  • 如果直接运行查询,使用 ORDER BY 而不使用视图会发生什么?
  • 我刚刚得知许多视图曾经是内连接,但现在已转换为左外连接。在此切换之前,顺序没有时间上的差异。两种方式返回的行数相同。

标签: performance sql-server-2008-r2 sql-order-by


【解决方案1】:

Explain 可能会告诉您更多信息,如果您有时间浏览它,但我猜我会说它正在对所有 27,000 行进行完整排序,因为它找不到有用的有序索引来避免额外排序。

在你所拥有的东西中很难发现,但一个简单的场景是

TableA KeyColumn,DataColumn,其中键列为主键

Select * From TableA Order By KeyColumn,将使用有序的PK索引,因此不需要排序。

select * From TableA Order By DataColumn,将读取表格然后进行排序。

为Datacolumn添加一个索引,就不需要排序了。

一旦你遇到更复杂的场景,可能你有一个有用的排序索引,但它不是最好的连接,所以它会快速连接,然后把所有时间都花在排序上。

如果我正在看这个并且该做什么并没有突然出现在我身上,例如。 requestid 根本没有索引,然后我会开始从查询中删除表,直到我停止出现不良行为。然后放回去取回它,然后使用这个希望不那么费力的查询和explain,看看我是否可以得到一个有用的索引或重述查询以使用更有用的索引。

祝你好运。

【讨论】:

    【解决方案2】:

    如果您对某列进行排序,则该列必须属于以下任一列: - 只有该列存在的自己的索引 - 或者在一个索引中包含 WHERE 子句中的字段,然后是 ORDER BY 子句中的字段。

    最好把查询显示给我。然后我可以和你一起集思广益。

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 2014-07-25
      • 2014-06-05
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多