yuekingofm 发表于 2013-05-09 16:59

请问大数据表使用order by如何优化性能

例如有一张表month_stat共2500万数据,要按流量字段倒序分页查询,查询语句里还有几个查询条件,前几页查询速度也在一秒内,但是分页越大查询越慢。
stat_date字段是日期,实际上每个月都会插入200万相同号码的数据进表里,stat_date用来区分日期。
下面是sql语句:
--------------------------------------------------------------------
-- Create table
create table MONTH_STAT
(
stat_date            VARCHAR2(32) not null, --日期,如2013-05
msisdn               VARCHAR2(32) not null, --号码
ec_id                NUMBER(10),            -- 企业id
ec_name            VARCHAR2(255),         -- 企业名称
month_flow         NUMBER(15,2) not null-- 流量
);
create index IDX_MONTH_STAT_DATE on MONTH_STAT (STAT_DATE);
create index IDX_MONTH_STAT_EC_ID on MONTH_STAT (EC_ID);
create index IDX_MONTH_STAT_MSISDN on MONTH_STAT (MSISDN);
create index IDX_MONTH_STAT_MFLOW on MONTH_STAT (MONTH_FLOW);


-- Select
select *
from (select a.*, rownum rn
          from (select s.month_flow,
                     s.msisdn,
                     s.stat_date,
                     s.ec_id
                  from MONTH_STAT s
               where 1 = 1
                      --and s.msisdn like '%137%'
                   and s.stat_date = '2013-03'
                   and s.ec_id in (1731, 1731)
               order by s.month_flow desc) a
         where rownum <= 10000 * 10)
where rn > (10000 - 1) * 10
-----------------------------------------------------------------------


我还试过倒序索引来实现,但是效果不理想,如果加上其他where条件查出来的数据依然不会倒序排列。
-----------------------------------------------------------------------
-- Create index
create index IDX_MONTH_STAT_ROWS on MONTH_STAT (month_flow DESC, stat_date, msisdn, ec_id);

-- Select
select *
from (select a.*, rownum rn
          from (select s.month_flow,
                     s.msisdn,
                     s.stat_date,
                     s.ec_id
                  from MONTH_STAT s
               where 1 = 1
                      --and s.msisdn like '%137%'
                   and s.stat_date = '2013-03'
                   and s.ec_id in (1731, 1731)
               ) a
         where rownum <= 10000 * 10)
where rn > (10000 - 1) * 10
-----------------------------------------------------------------------


请问有什么好方法优化吗?
页: [1]
查看完整版本: 请问大数据表使用order by如何优化性能