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 即可本人特别奉献全部可用分哦
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 即可本人特别奉献全部可用分哦
--试试这个呢
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
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
你先把执行计划拿出来看才行。