大家看看我这个语句还可以优化吗!我现在查询需要将近一分钟!!
sql = "SELECT username, sum(c.amount) as sshje FROM  T_pos_bill_header a,T_user  b,T_pos_bill_payment c where a.casherid=b.userid AND a.pbseqid=c.pbseqid and TO_char(billdate,'YYYY-MM-DD') between  '"&date1&"' and  '"&date2&"' group by username union SELECT '总金额' as username, sum(c.amount) as sshje FROM  T_pos_bill_header a,T_user  b,T_pos_bill_payment c where a.casherid=b.userid AND a.pbseqid=c.pbseqid and TO_char(billdate,'YYYY-MM-DD') between  '"&date1&"' and  '"&date2&"'"

解决方案 »

  1.   

    把T_pos_bill_header、T_user、T_pos_bill_payment的表及其主键、索引的定义告诉我。
      

  2.   

    t_pos_bill_header  
        PBSEQID CASHERID POSBILLNO MEMBERNO MACHINENO BILLDATE AUTHORID STATUS NOTES
    主键是PBSEQID  无索引t_pos_bill_payment
    PBSEQID PAYMENTTYPEID AMOUNT RECV CHANGES
    主键是PBSEQID
    索引是PBSEQID
    t_user
         USERID USERCODE USERNAME PASSWORD LOWERDISCOUNT CANCASH CANMAKEPRICE ISENABLED LASTUPDATED ISMANAGER
    主键是   USERID 
    索引是USERID 
      

  3.   

    你对t_pos_bill_header的BILLDATE加一个索引看看。
      

  4.   

    改变where子句的顺序a.casherid=b.userid AND a.pbseqid=c.pbseqid and TO_char(billdate,'YYYY-MM-DD') between  '"&date1&"' and  '"&date2&"'"将,确定的where条件放在子句的最后
      

  5.   

    贴出执行计划来 
    另外在最后Order By 下
      

  6.   

    用union all 比union 快些还有在billdate 建索引后 把where 语句变为 where  billdate between date('&date1&','yyyy-mm-dd') 这样的形式否则索引无效
      

  7.   

    我现在查询需要将近一分钟!!ORACLE的SQL语句查询速度取决于几个原因
    1.机器配置
    2.安装配置
    3.表结构与SQL语句的合理性
    4.是否使用了优化策略一般情况下的优化都可以通过SQL语句的优化来进行,而SQL语句的优化主要的一个指标就是看SQL语句的执行计划
    请参考以下连接:
    http://community.csdn.net/Expert/topic/5209/5209876.xml?temp=.6735498楼主将自己语句的执行计划贴出来 我们就知道哪些地方是可以优化的了