OracleSQL 查询语句在使用ROWNUM后出现极端性能问题的解决办法

情景:有一个多表联合查询语句

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 后会拖慢性能,但是在这种情况下却基本恢复了原来的性能,有点迷,如果有大神知道缘由的话欢迎指教~

你可能感兴趣的:(OracleSQL 查询语句在使用ROWNUM后出现极端性能问题的解决办法)