情景:有一个多表联合查询语句
select a.id, a.name, c.age, c.address
from ta a, tb b, tc c
where a.id = b.bid
and b.cid = c.id
and a.id in(...) --此为过滤条件。实际情况ta tb tc三张表有上百万数据
直接按上面的语句去查询,0.031秒出现结果,310条数据。
在加上ROWNUM后,
select t.*, rownum rn
from (select a.id, a.name, c.age, c.address
from ta a, tb b, tc c
where a.id = b.bid
and b.cid = c.id
and a.id in(...) --此为过滤条件。实际情况ta tb tc三张表有上百万数据
) t
where rn <= 10
出现了严重的性能问题,跑了七八分钟才出结果。10条数据。
解决办法:加上order by排序,改变其执行计划
select t.*, rownum rn
from (select a.id, a.name, c.age, c.address
from ta a, tb b, tc c
where a.id = b.bid
and b.cid = c.id
and a.id in(...) --此为过滤条件。实际情况ta tb tc三张表有上百万数据
order by a.id --加上排序,性能问题基本恢复
) t
where rn <= 10
0.061秒出现结果,10条数据。
后记
在查询语句后面加上order by排序的方法应该仅限于满足以下几种条件后才可能适用:
1.多表联合查询
2.可能包含了子查询
3.这几张表每张表的数据量很大(至少几十万条)
(悄悄bb:以上三条应该是导致性能问题的关键,不满足的话估计都不会出现性能问题)
4.查询结果总共不会超过几百条。
5.order by 的字段最好是索引字段
此性能问题并不会百分之百出现,有的数据库就很快,有的数据库就出了性能问题,这个问题应该是跟数据库和表的配置有关。
按理说加了order by 后会拖慢性能,但是在这种情况下却基本恢复了原来的性能,有点迷,如果有大神知道缘由的话欢迎指教~