问题描述:
   我现在碰到的问题是这样的
   
   我有这样一张表,数据量在300W 左右,里面有一个字段为 date 类型,暂假定为  searchDate 吧,
   对它建了索引,还有三个 varchar2 的字段,暂假定为 A , B , C 吧,我的 sql 是这样的
   select * from tableName where A = 'userName' and (B = 'XXX' or C = 'YYY') and searchDate > to_date('2008-01-01','yyyy-mm-dd')
   and searchData < to_date('2008-07-01','yyyy-mm-dd')
   在 pl-sql 中执行也就 2 秒左右 ,通过程序在公司服务器上查询时也要 7 秒左右,但是在生成环境查询时
   的速度简直要让人抓狂了,要5 分钟左右,刚开始怀疑是服务器碎片问题,把表也重新 create 了,但还是一样的
   真不知道怎么办了,现在被客户逼的受不了了,准备用分区表试试,但他们有不允许对查询条件现在,就算按月把数据
   放到不同的分区,也要在程序里去拼数据,这样不是就失去了分区表的优势了吗?还请高手指点...现在真不知道怎么优化了

解决方案 »

  1.   

    在product环境下,对具体的session trac一下,tkprof处理一下后,看一下真实的执行计划。
    再来考虑解决方法。
      

  2.   

    select * from tableName where A = 'userName' and B = 'XXX' and searchDate > to_date('2008-01-01','yyyy-mm-dd') 
      and searchData < to_date('2008-07-01','yyyy-mm-dd')
    union
    select * from tableName where A = 'userName' and C = 'YYY' and searchDate > to_date('2008-01-01','yyyy-mm-dd') 
      and searchData < to_date('2008-07-01','yyyy-mm-dd')
      

  3.   

    楼主试一下以下的SQL语句,再看一下执行计划:select * from tableName 
    where A = 'userName' and 
          (B = 'XXX' or C = 'YYY') and 
          searchdata between date'2008-01-01' and date'2008-07-01'与你的SQL语句差不多,但在条件中没有使用函数to_char(),
    在你的SQL语句中,使用了TO_CHAR()这个函数,所以,你在表列SEARCHDATA上建立的索引,没有使用到你的查询中.
      

  4.   

    补充一点:楼主的SQL语句也使用了SEARCHDATA列上的索引,但用DATE关键字比用TO_CHAR()函数的效率要高.楼主可以试一下.
      

  5.   

    谢谢你的建议了,我写to_date()函数是为了在pl-sql 里执行,在程序中是用 perpareStatement.setTimestamp() 给她赋的日期值