奉献全部可用分求以下主从表查询优化方案

aa765aa 2011-07-14 10:01:41
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 即可

本人特别奉献全部可用分哦
...全文
106 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
aa765aa 2011-07-22
  • 打赏
  • 举报
回复
谢谢楼上的哥们,是个好主意,但是要实践验证下,对SQL这些理解还不是很深刻的呢
沙界 2011-07-20
  • 打赏
  • 举报
回复
把 or 条件去掉 改用 union all 就不用全部扫描了
aa765aa 2011-07-19
  • 打赏
  • 举报
回复
强制使用索引了
aa765aa 2011-07-14
  • 打赏
  • 举报
回复
上面是客户回复的部分邮件
aa765aa 2011-07-14
  • 打赏
  • 举报
回复
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
aa765aa 2011-07-14
  • 打赏
  • 举报
回复
好的,好的,我先试试看看执行计划
主要是客户生产环境的数据不会发给我们的,
我只是在本地用的一个测试数据库,数据量小。另外索引和表空间也是建立在不同的表空间的
红色的值是程序动态绑定的,数据怎么分布具体还不清楚的呢
先谢谢上面两位
hudingchen 2011-07-14
  • 打赏
  • 举报
回复
OR (ti.C_PRT_MODE = 'R' AND th.C_EVENT_STATE = 'P')

这句多余了,可以去掉
BenChiM888 2011-07-14
  • 打赏
  • 举报
回复

--试试这个呢
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

viscount 2011-07-14
  • 打赏
  • 举报
回复
如果是oracle ,先做2表的分析.分析下2表,确定走了索引。
你先把执行计划拿出来看才行。
tangren 2011-07-14
  • 打赏
  • 举报
回复
收集两表最新的统计数据,给出执行计划.

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧