SELECT * FROM (SELECT r_t.*, ROWNUM r_rownum FROM ( select /*+rule*/ subscribersn from subscriberrentinfo where version >= :1 and version <= :2 ) r_t WHERE ROWNUM < :3 ) WHERE r_rownum >= :4 
性能测试时发现此行语句执行时耗时最多,CPU使用率98%,请问如何进行优化

解决方案 »

  1.   

    Oracle是什么版本? 如果是10g,11g,12c,请把/*+rule*/ 提示去掉。
      

  2.   

    条件的不可控性太大了,这个分页sql不可能在所有条件下都能被优化
      

  3.   


    如果满足这个version条件的数据很少很少,那么version上面的索引可解决问题,与分页无关,如果满足这个条件的数据非常非常多,几乎奔着全表去了,那么第一页的结果也应该很快,但是如果满足条件的数据不多不少,那就尴尬了。
      

  4.   


    如果满足这个version条件的数据很少很少,那么version上面的索引可解决问题,与分页无关,如果满足这个条件的数据非常非常多,几乎奔着全表去了,那么第一页的结果也应该很快,但是如果满足条件的数据不多不少,那就尴尬了。一不小心就三连:如果是第二种情况:满足条件的数据很多,那么你那/*rule*/提示就更尴尬了,去掉吧。另外,把这事情扯的更复杂点:因为使用了绑定变量,version取值不同的时候,sql的执行计划可能会做出一些调整,这个与你的数据库版本,包括某些绑定变量相关的参数设置都会造成一些影响,这个要视情况而定了,比如bind peeking打开与否?ACS打开与否,cardinality feedback打开与否?