我有一个视图,它连接了24个表(除了1个外部连接外都有)和83个列。当我从没有order by子句的视图中选择*时,它在大约4:27秒内返回所有列的27k行。如果我执行相同的选择但添加'order by requestId'子句则需要83分钟才能完成。 按顺序排列的列在原始表中编入索引。
我已经尝试通过requestId将它包装在Select * from(.......)中,但得到相同的结果。
关于在哪里寻找的建议
答案 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子句中的字段。
如果您向我显示查询,那该效果最佳。然后我可以和你一起集体讨论。