大侠们,
你们好,我需要从后台的oracle取数据,如下的数据是我写的,大概是关联到6张表的数据,如下是我写的语句,能否帮忙看看哪里优化下?就10天的数据,已经运行了3个小时,非常感谢你们的帮助SELECT  EO.LIFNR vendor_number,LA.LAND1 Vendor_country,EO.ERNAM Buyer,MR.LABOR Terex_Code,EP.MATNR material_number,EP.TXZ01 Short_text,EB.MENGE Quantity,EP.MEINS Unit,(EP.NETPR/EP.BPUMN/EP.EBELP) NETPRICE,EO.WAERS Currency,ET.EINDT LEADDELIVERYDATE,EB.BUDAT ACTUALDELIVERYDATE, EO.BEDAT Create_Date,EO.UNSEZ  FROM EKPO EP, EKBE EE, EKKO EO,EKET ET,LFA1 LA,MARA MR,EKBE EB WHERE ET.EBELN=EP.EBELN  and ET.EBELP=EP.EBELP AND EB.EBELN=EP.EBELN and EB.EBELP=EP.EBELP and EP.MATNR=MR.MATNR and LA.LIFNR=EO.LIFNR and  EB.BWART='101' and EB.BEWTP='E' and TO_DATE(EB.BUDAT,'yyyy-mm-dd') BETWEEN TO_DATE('2016-2-1', 'yyyy-mm-dd') and TO_DATE('2016-2-10', 'yyyy-mm-dd')

解决方案 »

  1.   

     TO_DATE(EB.BUDAT,'yyyy-mm-dd') BETWEEN TO_DATE('2016-2-1', 'yyyy-mm-dd') and TO_DATE('2016-2-10', 'yyyy-mm-dd')
    随便看一眼,这东西这么写就不走索引了,直接用char类型比较吧,别用to_date转了 ,另外你这个字段既然是要保存日期,为啥建表的时候不用date类型。
      

  2.   

    用left join ......on 吧,直接用你那样的太耗费计划资源。
      

  3.   

    谢谢大侠们!
    1. xu176032 and  haier_gege, 我们打算是在现有的这套很老的ERP系统,后台用Oracle8I 数据库,我查了下,BUDAT确实是VARCHAR2类型,但不知道日期型的字符串是如何比较2. 确实很耗资源,最后提示out of memory, left join on要怎么写比较好,差不多有6张表的内容
      

  4.   

    TO_DATE(EB.BUDAT, 'yyyy-mm-dd') BETWEEN
           TO_DATE('2016-2-1', 'yyyy-mm-dd') and
           TO_DATE('2016-2-10', 'yyyy-mm-dd')这个不走索引,创建一个  CREATE INDEX P_IDX ON EKBE(TO_DATE(EB.BUDAT, 'yyyy-mm-dd'));  这样的索引,你再试试。
      

  5.   

    谢谢!chenfeng.我试下。
      

  6.   

    我试写了个如下Left Join语句,但提示我“ORA-00933: SQL command not properly ended”这个错误,不知道是哪里写错了,请大侠们帮忙看下,非常感谢!SELECT EP.EBELN EBELN,EP.EBELP EBELP,EKBE.BUDAT BUDAT,EB.BELNR BELNR,EB.BUZEI BUZEI,EB.MENGE MENGE FROM EKBE EB LEFT  JOIN  EKPO EP ON  EB.EBELN=EP.EBELN and EB.EBELP=EP.EBELP  WHERE EB.BEWTP='E' AND EB.BWART='101' AND TO_DATE(EB.BUDAT,'yyyy-mm-dd') BETWEEN TO_DATE('2016-2-1', 'yyyy-mm-dd') AND TO_DATE('2016-2-10', 'yyyy-mm-dd');
      

  7.   

    这些关联字段是否存在索引?特别是这三个字段:EB.BWART 、 EB.BEWTP、EB.BUDAT是否有索引?有何种索引?
    如果可以添加索引的话,可以直接在EB.BWART 、 EB.BEWTP、EB.BUDAT上面建一个联合索引,BUDAT可以考虑建一个函数索引,或者直接用EB.BUDAT in (2016-2-1,2016-2-2,)这样走索引也行。另外,把执行计划贴一下吧
      

  8.   

     select 第三个字段的时候EKBE.BUDAT BUDAT 这个地方错了。
      

  9.   

    首先你日期的比较不要用to_date转换了,可以直接用字符串比较出来的。再者你用eft join on来连接表。