在一个web项目里需要查询一张表,该表有1000万条数据,然后在页面上分页显示(每页20条)查询语句如下
SELECT t1.* FROM (SELECT rownum as num, t.* FROM (SELECT * FROM tablename where SqlClause order by CI_TIME) t) t1 where num > beginRecordNumber and num < endRecordNumber
说明:其中SqlClause是根据页面输入条件整理出来的查询条件,beginRecordNumber和endRecordNumber根据第几页计算出来的编号
每次查询都要30多秒,把语句考到PLSQL下直接查询也要5秒多。
问题:
1、一张表中放1000万条数据在oracle是不太多了?多少条数据比较合适?
2、上面的查询语句有那些地方需要优化?
3、是否可以在数据库方面做什么设置提高效率吗?(索引已经做了)只有47分了全给出来,请高手指教
SELECT t1.* FROM (SELECT rownum as num, t.* FROM (SELECT * FROM tablename where SqlClause order by CI_TIME) t) t1 where num > beginRecordNumber and num < endRecordNumber
说明:其中SqlClause是根据页面输入条件整理出来的查询条件,beginRecordNumber和endRecordNumber根据第几页计算出来的编号
每次查询都要30多秒,把语句考到PLSQL下直接查询也要5秒多。
问题:
1、一张表中放1000万条数据在oracle是不太多了?多少条数据比较合适?
2、上面的查询语句有那些地方需要优化?
3、是否可以在数据库方面做什么设置提高效率吗?(索引已经做了)只有47分了全给出来,请高手指教
FROM (
SELECT rownum as num, t.*
FROM (
SELECT * FROM tablename where SqlClause order by CI_TIME
) t
where num < endRecordNumber
) t1
where num > beginRecordNumber
这个问题好解决,第一:要为这个表建一个索引(CI_TIME),因为你要对全表遍历(order by CI_TIME)
问题就在这里,如果不考虑数据的正确性你可以把order by放到子查询的外边,速度变化明显
第二:我奇怪的是你为什么用三次select,用两次就好了
SELECT rownum as num, t1.* FROM (SELECT rownum num,t.* FROM tablename t where SqlClause order by CI_TIME) t1 where num > beginRecordNumber and num < endRecordNumber
前段时间我测试了一个50万条左右的表前台反映速度在2秒之内
我没分了!多给我些吧!!
不算多,这个由业务实际情况而定! 2、上面的查询语句有那些地方需要优化?
检查一下你的SQL语句的执行计划,添加必要的索引 3、是否可以在数据库方面做什么设置提高效率吗?(索引已经做了)
采用二分算法,先找出分页位置的ID,然后再直接 select * from ... where id > xxx