使用单列order by子句时对视图的查询速度慢

时间:2012-07-06 13:00:39

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

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

我已经尝试通过requestId将它包装在Select * from(.......)中,但得到相同的结果。

关于在哪里寻找的建议

2 个答案:

答案 0 :(得分:0)

解释可能会告诉你更多,如果你有时间跋涉它,但猜测我会说它正在完成所有27,000行,因为它找不到有用的有序索引来避免额外的排序。

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

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

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

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

为Datacolumn添加索引,不需要排序。

一旦你遇到更复杂的场景,可能就是你有一个有用的订购索引,但它不是最好的加入,所以它快速加入,然后花费所有时间订购。

如果我正在看这个并且做什么并没有跳出来,例如。对于requestid完全没有索引,然后我开始从查询中删除表,直到我停止得到不良行为。然后把一个重新放回来,然后使用这个希望不那么艰巨的查询和explain,看看我是否可以获得一个usful索引或重述查询以使用更有用的索引。

祝你好运。

答案 1 :(得分:0)

如果您在列上有订单,则该列必须是以下任一项的一部分:   - 仅存在该列的自己的索引   - 或者在一个索引中,该索引具有WHERE子句中的字段,然后是具有正确顺序的ORDER BY子句中的字段。

如果您向我显示查询,那该效果最佳。然后我可以和你一起集体讨论。