在一个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分了全给出来,请高手指教

解决方案 »

  1. 分页,应写成:SELECT t1.* 
      FROM (
            SELECT rownum as num, t.* 
              FROM (
                    SELECT * FROM tablename where SqlClause order by CI_TIME
                    ) t
             where num < endRecordNumber
            ) t1 
    where num > beginRecordNumber
      

  2. 你这个没有where 条件,可以在 CI_TIME 建一个索引,这样从索引顺序读就可以避免排序了
      

  3. where SqlClause 就是查询条件
      

  4. 这明显是一个分页语句
    这个问题好解决,第一:要为这个表建一个索引(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秒之内
    我没分了!多给我些吧!!
      

  5.    1、一张表中放1000万条数据在oracle是不太多了?多少条数据比较合适?
    不算多,这个由业务实际情况而定!   2、上面的查询语句有那些地方需要优化?
    检查一下你的SQL语句的执行计划,添加必要的索引   3、是否可以在数据库方面做什么设置提高效率吗?(索引已经做了)
    采用二分算法,先找出分页位置的ID,然后再直接 select * from   ... where id > xxx
      

类似问题 »