2012-07-06 53 views
0

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

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

建议上哪里找

+1

这个特定的查询是否真的需要所有24个表中的列?也许你应该考虑针对基表编写一个有针对性的查询,而不是继承超大视图的所有噪声。 – 2012-07-06 13:07:22

+0

不幸的是,它返回的数据被导出到excel进行进一步分析。 – 2012-07-06 13:09:37

+1

嗯,我会要求查看执行计划,但恐怕他们会给我做噩梦。 :-( – 2012-07-06 13:10:22

回答

0

解释可能会告诉你更多,如果您有通过它涉水的时候,但我猜测会说这是做了充分的排序所有27000行,因为它无法找到一个有用的有序索引来避免额外的排序。

这将是很难发现当中你有什么,但一个简单的场景将

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

Select * From TableA Order By KeyColumn,将用PK指数,这是订单,所以不需要排序。

select * From TableA Order By DataColumn,会读取表格然后做一个排序。

为数据列添加索引,并且不需要排序。

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

如果我在看这个,做什么都不会跳到我身上。根本没有任何索引的requestid,那么我会开始剔除查询中的表,直到我停止获取不需要的行为。然后放回一个来取回它,然后使用这个希望不那么费力的查询并查看是否可以获得有用的索引或重新查询以使用更有用的索引。

祝你好运。

0

如果您对列有秩序,那么该列必须是任一部分: - 它自己的索引,其中,仅列存在 - 或者在具有在WHERE子句,然后将字段的索引ORDER BY子句中的字段按照确切的顺序排列。

如果您向我展示查询,最好。然后我可以和你一起头脑风暴。