表結構:  NUMREPORTREALSENDGUID NUMBER not null,
  NUMMMSID              NUMBER(15),
  VC2SERVICECODE        VARCHAR2(24),
  VC2CAMPAIGNID         VARCHAR2(24),
  VC2CALLEDNUM          VARCHAR2(64),
  DATCREATE             DATE,
  VC2REPORTSTATUS       VARCHAR2(1),
  VC2STATUS             VARCHAR2(1),
  VC2USERID             VARCHAR2(128)SQL:select vc2servicecode,vc2campaignid,datcreate,vc2reportstatus,vc2status
from imms_report_realsend
where datcreate between YYYY-MM-DD and yyyy-mm-dd
and vc2userid=?
order by datcreate目前數據庫里已有1000多萬筆數據。查一下其中的200W大概需要2分鐘,太長了。(不知道是不是分頁有問題,用的是extremetable)最終數據量可能會有5400W1.表分区(問題: 如果建表分區的話只能按日期建,每月一個分區,但是如果做跨月查詢的話,速度會不會提升? 還是更可能還會變慢?)2.索引 已經在DATCREATE上建了索引(datcreate有order by操作),但是效果并不明顯!請做過這樣的大數據量查詢的XDJM指教一下!
謝謝!

解决方案 »

  1.   

    1.建立相关索引.
    2.在oracle的Enterprise Manager Console里面把这个表分析一下.
      

  2.   

    200W的数据select出来,想在1分钟以内查询出来,那也只能提高服务器的硬件配置了
      

  3.   

    一下查出来200w数据,怎么看,是不是需求有问题阿?
    建分区,然后在分区上建立local索引,再看下select的速度,看响应速度
      

  4.   

    这个问题需要考虑并行,充分利用多CPU的优势,仅仅分区并不能很大的提高速度。
      

  5.   

    感觉速度差不多了修改下select 语句 看是否可以把条件简化看否把datcreate 改成 smalldate
     use +--数据库名
    select * from +--表名
    where (datcreate between YYYY-MM-DD and yyyy-mm-dd )
    and (vc2userid=? )
    order by datcreate 
    GO
      

  6.   


    前臺有分頁 用的extremetable 
    也是利用的rownum 的分頁!
      

  7.   

    不要让用户的需求玩死开发人员,也玩死DBA
      

  8.   

    1、用户的需求有时候可以适当协调
    2、用户估计一下子也不需要200w记录,需求了解
    3、适当的索引、分区还是需要的
    4、between and 函数本身的机制就不是很合适进行大数据量查询
      

  9.   

    大数据量查询在oracle经常会遇见
    跟这几个方面有关
    1.你的sql语句语法结构是不是最优的, oracle里面有个查询分析器
    2.索引的类型是否选对
    3.采用view