SELECT ti.C_BK_GROUP_ID,ti.C_CNTY_CODE,
         ti.C_ORG_UNIT_CODE,ti.C_TRX_REF,ti.C_MAIN_REF,ti.I_EVENT_TIMES,
         ti.C_MODULE,ti.C_INFOR_UNIT,ti.C_DOC_INDEX,ti.I_PRT_ROWS_PAGE,
         ti.C_MSEND_NAME,ti.C_FSEND_NAME,ti.C_DOC_DESC,ti.C_PRTING_INFO,
         ti.C_PEPRTING_INFO,ti.C_PRT_STATE,ti.C_PRT_MODE,
         th.C_EVENT_STATE,th.C_EVENT_NAME,th.C_FUNC_ID,th.C_FUNC_NAME,th.C_RELEASE_OP,th.C_LAST_MODI_OP
    FROM EXIMTRX.TRX_DOCS_INDX_MGR ti, EXIMTRX.TRX_DOCS_HEADER th
   WHERE (ti.C_BK_GROUP_ID = th.C_BK_GROUP_ID
          AND ti.C_CNTY_CODE = th.C_CNTY_CODE
          AND ti.C_UNIT_CODE = th.C_UNIT_CODE
          AND ti.C_TRX_REF = th.C_TRX_REF
          AND ti.C_MAIN_REF = th.C_MAIN_REF
          AND ti.I_EVENT_TIMES = th.I_EVENT_TIMES
          AND ti.C_MODULE = th.C_MODULE)
          
         AND (ti.C_PRT_STATE = 'N'
              AND ( (ti.C_PRT_MODE = 'R')
                    OR (ti.C_PRT_MODE = 'A' AND th.C_EVENT_STATE = 'M')
                    OR (ti.C_PRT_MODE = 'R' AND th.C_EVENT_STATE = 'P'))
             )
                    
         AND (th.D_SYS_REL_DATE >= TO_DATE ('2008-9-2', 'yyyy-MM-dd')
         OR th.D_SYS_OP_DATE >= TO_DATE ('2008-9-2', 'yyyy-MM-dd'))
         ORDER BY th.D_SYS_OP_DATE主表90多万条记录,从表160多万条记录,现在是在where 条件的字段上面都建了索引的了,上面的
ti.C_BK_GROUP_ID = th.C_BK_GROUP_ID
          AND ti.C_CNTY_CODE = th.C_CNTY_CODE
          AND ti.C_UNIT_CODE = th.C_UNIT_CODE
          AND ti.C_TRX_REF = th.C_TRX_REF
          AND ti.C_MAIN_REF = th.C_MAIN_REF
          AND ti.I_EVENT_TIMES = th.I_EVENT_TIMES
          AND ti.C_MODULE = th.C_MODULE
是主从表的关联关系,也是联合主键目前的生产环境是oracle 10G的数据库现在的问题是该语句从执行计划上看和客户反映都是每次主从表都会做全表扫描的呢,效率速度就比较慢的了,
现在请高人指点下怎么做优化,或者拆表或者在从表中建立where条件有的冗余字段,或者其它方案,
特别针对oracle也可以,最好就是通用支持 DB2 MS-SQL server oracle 即可本人特别奉献全部可用分哦

解决方案 »

  1.   


    --试试这个呢
    SELECT TI.C_BK_GROUP_ID,
           TI.C_CNTY_CODE,
           TI.C_ORG_UNIT_CODE,
           TI.C_TRX_REF,
           TI.C_MAIN_REF,
           TI.I_EVENT_TIMES,
           TI.C_MODULE,
           TI.C_INFOR_UNIT,
           TI.C_DOC_INDEX,
           TI.I_PRT_ROWS_PAGE,
           TI.C_MSEND_NAME,
           TI.C_FSEND_NAME,
           TI.C_DOC_DESC,
           TI.C_PRTING_INFO,
           TI.C_PEPRTING_INFO,
           TI.C_PRT_STATE,
           TI.C_PRT_MODE,
           TH.C_EVENT_STATE,
           TH.C_EVENT_NAME,
           TH.C_FUNC_ID,
           TH.C_FUNC_NAME,
           TH.C_RELEASE_OP,
           TH.C_LAST_MODI_OP
      FROM (SELECT *
              FROM EXIMTRX.TRX_DOCS_INDX_MGR TI
             WHERE (TI.C_PRT_STATE = 'N' AND
                   ((TI.C_PRT_MODE = 'R') OR
                   (TI.C_PRT_MODE = 'A' AND TH.C_EVENT_STATE = 'M') OR
                   (TI.C_PRT_MODE = 'R' AND TH.C_EVENT_STATE = 'P')))) TI,
           (SELECT *
              FROM EXIMTRX.TRX_DOCS_HEADER TH
             WHERE (TH.D_SYS_REL_DATE >= TO_DATE('2008-9-2', 'yyyy-MM-dd') OR
                   TH.D_SYS_OP_DATE >= TO_DATE('2008-9-2', 'yyyy-MM-dd'))) TH
     WHERE (TI.C_BK_GROUP_ID = TH.C_BK_GROUP_ID AND
           TI.C_CNTY_CODE = TH.C_CNTY_CODE AND TI.C_UNIT_CODE = TH.C_UNIT_CODE AND
           TI.C_TRX_REF = TH.C_TRX_REF AND TI.C_MAIN_REF = TH.C_MAIN_REF AND
           TI.I_EVENT_TIMES = TH.I_EVENT_TIMES AND TI.C_MODULE = TH.C_MODULE)
     ORDER BY TH.D_SYS_OP_DATE
      

  2.   

    OR (ti.C_PRT_MODE = 'R' AND th.C_EVENT_STATE = 'P')这句多余了,可以去掉
      

  3.   

    SELECT ti.C_BK_GROUP_ID,
             ti.C_CNTY_CODE,
             ti.C_ORG_UNIT_CODE,
             ti.C_TRX_REF,
             ti.C_MAIN_REF,
             ti.I_EVENT_TIMES,
             ti.C_MODULE,
             ti.C_INFOR_UNIT,
             ti.C_DOC_INDEX,
             ti.I_PRT_ROWS_PAGE,
             ti.C_MSEND_NAME,
             ti.C_FSEND_NAME,
             ti.C_DOC_DESC,
             ti.C_PRTING_INFO,
             ti.C_PEPRTING_INFO,
             ti.C_PRT_STATE,
             ti.C_PRT_MODE,
             th.C_EVENT_STATE,
             th.C_EVENT_NAME,
             th.C_FUNC_ID,
             th.C_FUNC_NAME,
             th.C_RELEASE_OP,
             th.C_LAST_MODI_OP
        FROM EXIMTRX.TRX_DOCS_INDX_MGR ti, EXIMTRX.TRX_DOCS_HEADER th
       WHERE (    ti.C_BK_GROUP_ID = th.C_BK_GROUP_ID
              AND ti.C_CNTY_CODE = th.C_CNTY_CODE
              AND ti.C_UNIT_CODE = th.C_UNIT_CODE
              AND ti.C_TRX_REF = th.C_TRX_REF
              AND ti.C_MAIN_REF = th.C_MAIN_REF
              AND ti.I_EVENT_TIMES = th.I_EVENT_TIMES
              AND ti.C_MODULE = th.C_MODULE)
             AND (ti.C_PRT_STATE = :"SYS_B_0"
                  AND ( (ti.C_PRT_MODE = :"SYS_B_1")
                       OR (ti.C_PRT_MODE = :"SYS_B_2"
                           AND th.C_EVENT_STATE = :"SYS_B_3")
                       OR (ti.C_PRT_MODE = :"SYS_B_4"
                           AND th.C_EVENT_STATE = :"SYS_B_5")))
             AND (th.D_SYS_REL_DATE >= TO_DATE (:"SYS_B_6", :"SYS_B_7")
             OR th.D_SYS_OP_DATE >= TO_DATE (:"SYS_B_8", :"SYS_B_9"))
             ORDER BY th.D_SYS_OP_DATE
                         -          EXIMTRX.TRX_DOCS_INDX_MGR    has 1,676,546 Records-          EXIMTRX.TRX_DOCS_HEADER      has  960,025 Record
    because it is full scan a large table . Can EE tuning this SQL ?I search this subject and found related topic in 
     Tuning Large-table Full-table scans in 
     http://www.dba-oracle.com/art_orafaq_oracle_sql_tune_table_scan.htm ,it may help you
      

  4.   

    如果是oracle ,先做2表的分析.分析下2表,确定走了索引。
    你先把执行计划拿出来看才行。
      

  5.   

    把 or 条件去掉 改用 union all 就不用全部扫描了 
      

  6.   

    谢谢楼上的哥们,是个好主意,但是要实践验证下,对SQL这些理解还不是很深刻的呢