系统中需要对一张大数据量表做分页查询,表数据量在几千万行的级别,而且仍然会不断增加。系统为J2EE应用,TOMCAT5.0作为应用服务器,框架采用spring 2.0,使用springJdbcTemplate做数据库持久。数据库采用oracle10g。分页查询只操作单张表A。A表已经建成按过车时间gcsj的分区表。以下是SQL语句:
SELECT * FROM (SELECT ROWNUM no, a.* FROM (select a.* from a where hphm like ? and hpzl = ? and gcsj >= to_date(?,'yyyy-mm-dd hh24:mi:ss')and gcsj <= to_date(?,'yyyy-mm-dd hh24:mi:ss') order by gcsj desc) a WHERE ROWNUM <=101) WHERE no >= 1
目前的问题是:当gcsj(date型)范围很大时,比如一个月,SQL语句( select a.* from a where hphm like ? and hpzl = ? and gcsj >= to_date(?,'yyyy-mm-dd hh24:mi:ss')and gcsj <= to_date(?,'yyyy-mm-dd hh24:mi:ss') order by gcsj desc )执行非常慢。如果去除order by 语句,在PL/SQL里执行速度还可以。但是由于必须做排序,所以当结果集非常大的时候速度很慢,几乎是没法查询得到。
请问对于大数据量表查询返回结果集非常大的应用场景下,对于order by 的应用是否有好的解决方案?小弟在此多谢了!!!
SELECT * FROM (SELECT ROWNUM no, a.* FROM (select a.* from a where hphm like ? and hpzl = ? and gcsj >= to_date(?,'yyyy-mm-dd hh24:mi:ss')and gcsj <= to_date(?,'yyyy-mm-dd hh24:mi:ss') order by gcsj desc) a WHERE ROWNUM <=101) WHERE no >= 1
目前的问题是:当gcsj(date型)范围很大时,比如一个月,SQL语句( select a.* from a where hphm like ? and hpzl = ? and gcsj >= to_date(?,'yyyy-mm-dd hh24:mi:ss')and gcsj <= to_date(?,'yyyy-mm-dd hh24:mi:ss') order by gcsj desc )执行非常慢。如果去除order by 语句,在PL/SQL里执行速度还可以。但是由于必须做排序,所以当结果集非常大的时候速度很慢,几乎是没法查询得到。
请问对于大数据量表查询返回结果集非常大的应用场景下,对于order by 的应用是否有好的解决方案?小弟在此多谢了!!!
增大sort_area_size 会提高排序速度
select a.* from a where gcsj >= to_date(?,'yyyy-mm-dd hh24:mi:ss')
and gcsj <= to_date(?,'yyyy-mm-dd hh24:mi:ss') order by gcsj desc
比较大小的话,VARCHAR2型的时间也同样可以做比较。
少了几个to_date()转换,速度肯定会快很多。
------------------------------------ ----------- ------------------------------
sort_area_size integer 65536(bytes, default value)
SQL>避免磁盘排序,其他就剩下业务上规避这个问题,加强查询条件,或者在页面提示用户查询时间过长
建议还是再gcsj字段上单独建个索引,组合索引需要合理使用才会起作用。
比如你在A表的a、b、c字段上建组合索引的话,它是讲究顺序的,假设:create index idx_A_abc on A(a,b,c);
那么你的语句中要包含第一个字段(a字段)才会起作用,如果只是用到了b、c字段,那么这个组合索引不会提高你sql语句执行的效率的。
要看order by gcsj的时候有没有用那联合索引.
如果没有用到的话,还是新建一个单独的比较好.
结果集很大的时候,排序也必然会造成性能的占用
用row_number()over()试试,可能会好一点