背景:km_cmdoc_main这张表,有11w的数据,3天前,我执行了下面两条语句,更新了所有数据:update km_cmdoc_main set fd_delete_type = '02';
update km_cmdoc_main set fd_enter_system = '02';
现象:select *
from (select m.*
from km_cmdoc_main m
inner join (select distinct fd_cmdoc_id
from km_cmdoc_review_handler
where fd_company_id =
'139dc1399ef69959cd4e0a14395a3f8e') h
on m.fd_id = h.fd_cmdoc_id
union all
select mau.*
from km_cmdoc_auth au
inner join km_cmdoc_main mau
on au.doc_creator_company_id = mau.doc_creator_company_id
where au.fd_auth_id = '139dc23f04c6385c52ab1724864a9a121b')
where doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'1.执行上面的sql语句,反复试了许多次,十几分钟都执行不完。请问是什么原因?
2.修改上面的sql,where语句换成这样:where doc_status <> '10,其他不变,则非常快
3.如果不用union,只单表查询,则非常快:
select *
from km_cmdoc_main
where doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'
update km_cmdoc_main set fd_enter_system = '02';
现象:select *
from (select m.*
from km_cmdoc_main m
inner join (select distinct fd_cmdoc_id
from km_cmdoc_review_handler
where fd_company_id =
'139dc1399ef69959cd4e0a14395a3f8e') h
on m.fd_id = h.fd_cmdoc_id
union all
select mau.*
from km_cmdoc_auth au
inner join km_cmdoc_main mau
on au.doc_creator_company_id = mau.doc_creator_company_id
where au.fd_auth_id = '139dc23f04c6385c52ab1724864a9a121b')
where doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'1.执行上面的sql语句,反复试了许多次,十几分钟都执行不完。请问是什么原因?
2.修改上面的sql,where语句换成这样:where doc_status <> '10,其他不变,则非常快
3.如果不用union,只单表查询,则非常快:
select *
from km_cmdoc_main
where doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'
解决方案 »
- 我用oracle连到远程服务器的两个数据库
- oracle数据库中修改dba的密码问题
- oracle存储过程
- 把CLOB写到文件中,请高手解决
- ora-12500:TNS监听程序无法启动服务器进程 的 问题,在线等。
- 我想查出在dalluser中的数据在dcustmsg中不存在(他们有个相同的字段ID),且end-time=20500101的数据,
- Oracle新手求教:Oracle数据库连接会过期吗?
- 关于两表对更新的问题
- 救命:最简单的一条update语句,如何优化?
- Oracle+Jsp+JavaBean+P4产生的问题?
- 问个oracle很白痴的问题
- oracle10g 在处理大数据量时如何保证查询速度
VIEW SCOTT 24 2 19274
UNION-ALL
VIEW SYS VM_NWVW_1 17 1 9637
HASH UNIQUE 17 1 347
NESTED LOOPS 16 2377 824819
TABLE ACCESS FULL SCOTT KM_CMDOC_MAIN 3 1 271
TABLE ACCESS BY INDEX ROWID SCOTT KM_CMDOC_REVIEW_HANDLER 13 8053 612028
INDEX RANGE SCAN SCOTT INDEX_FD_COMPANY_ID 0 32213
HASH JOIN 7 1 347
TABLE ACCESS FULL SCOTT KM_CMDOC_AUTH 3 1 76
TABLE ACCESS FULL SCOTT KM_CMDOC_MAIN 3 1 271
VIEW SCOTT 824 18408 177397896
UNION-ALL
HASH JOIN 818 18407 5687763
TABLE ACCESS FULL SCOTT KM_CMDOC_MAIN 3 16 4336
VIEW SCOTT 814 32213 1224094
HASH UNIQUE 814 32213 2448188
TABLE ACCESS FULL SCOTT KM_CMDOC_REVIEW_HANDLER 239 32213 2448188
NESTED LOOPS
NESTED LOOPS 6 1 347
TABLE ACCESS FULL SCOTT KM_CMDOC_AUTH 3 1 76
INDEX RANGE SCAN SCOTT IFK3F635C73D08396D 0 28
TABLE ACCESS BY INDEX ROWID SCOTT KM_CMDOC_MAIN 3 16 4336
select /*+ index(mau IFK3F635C73D08396D)*/ mau.*
from km_cmdoc_auth au
inner join km_cmdoc_main mau
on au.doc_creator_company_id = mau.doc_creator_company_id
where au.fd_auth_id = '139dc23f04c6385c52ab1724864a9a121b'
VIEW SCOTT 23 2 19274
UNION-ALL
VIEW SYS VM_NWVW_1 17 1 9637
HASH UNIQUE 17 1 347
NESTED LOOPS 16 2377 824819
TABLE ACCESS FULL SCOTT KM_CMDOC_MAIN 3 1 271
TABLE ACCESS BY INDEX ROWID SCOTT KM_CMDOC_REVIEW_HANDLER 13 8053 612028
INDEX RANGE SCAN SCOTT INDEX_FD_COMPANY_ID 0 32213
NESTED LOOPS
NESTED LOOPS 6 1 347
TABLE ACCESS FULL SCOTT KM_CMDOC_AUTH 3 1 76
INDEX RANGE SCAN SCOTT IFK3F635C73D08396D 0 28
TABLE ACCESS BY INDEX ROWID SCOTT KM_CMDOC_MAIN 3 1 271
1、单独执行看看需要多久,select m.*
from km_cmdoc_main m
inner join (select distinct fd_cmdoc_id
from km_cmdoc_review_handler
where fd_company_id =
'139dc1399ef69959cd4e0a14395a3f8e') h
on m.fd_id = h.fd_cmdoc_id
where doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'
2、单独执行看看需要多久,select mau.*
from km_cmdoc_auth au
inner join km_cmdoc_main mau
on au.doc_creator_company_id = mau.doc_creator_company_id
where au.fd_auth_id = '139dc23f04c6385c52ab1724864a9a121b'
and doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'3、把上面两个UNION ALL看看需要多久
select m.*
from km_cmdoc_main m
inner join (select distinct fd_cmdoc_id
from km_cmdoc_review_handler
where fd_company_id =
'139dc1399ef69959cd4e0a14395a3f8e') h
on m.fd_id = h.fd_cmdoc_id
where doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'
union all
select mau.*
from km_cmdoc_auth au
inner join km_cmdoc_main mau
on au.doc_creator_company_id = mau.doc_creator_company_id
where au.fd_auth_id = '139dc23f04c6385c52ab1724864a9a121b'
and doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'
from km_cmdoc_main m
inner join (select distinct fd_cmdoc_id
from km_cmdoc_review_handler
where fd_company_id =
'139dc1399ef69959cd4e0a14395a3f8e') h
on m.fd_id = h.fd_cmdoc_id
where doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'
from km_cmdoc_main m
inner join (select distinct fd_cmdoc_id
from km_cmdoc_review_handler
where fd_company_id = '139dc1399ef69959cd4e0a14395a3f8e') h
on m.fd_id = h.fd_cmdoc_id
where doc_status <> '10'执行计划:SELECT STATEMENT, GOAL = ALL_ROWS 818 18407 5687763
HASH JOIN 818 18407 5687763
TABLE ACCESS FULL SCOTT KM_CMDOC_MAIN 3 16 4336
VIEW SCOTT 814 32213 1224094
HASH UNIQUE 814 32213 2448188
TABLE ACCESS FULL SCOTT KM_CMDOC_REVIEW_HANDLER 239 32213 24481882.where包含两个字段的其中一个,非常慢,sql:select m.*
from km_cmdoc_main m
inner join (select distinct fd_cmdoc_id
from km_cmdoc_review_handler
where fd_company_id = '139dc1399ef69959cd4e0a14395a3f8e') h
on m.fd_id = h.fd_cmdoc_id
where doc_status <> '10'
and fd_enter_system <> '02'
执行计划:SELECT STATEMENT, GOAL = ALL_ROWS 122 32 308384
VIEW SYS VM_NWVW_1 122 32 308384
HASH UNIQUE 122 32 11104
NESTED LOOPS 120 30679 10645613
TABLE ACCESS FULL SCOTT KM_CMDOC_MAIN 3 9 2439
TABLE ACCESS BY INDEX ROWID SCOTT KM_CMDOC_REVIEW_HANDLER 13 3579 272004
INDEX RANGE SCAN SCOTT INDEX_FD_COMPANY_ID 0 32213
select m.*
from km_cmdoc_main m
inner join (select distinct fd_cmdoc_id
from km_cmdoc_review_handler
where fd_company_id =
'139dc1399ef69959cd4e0a14395a3f8e') h
on m.fd_id = h.fd_cmdoc_id
where doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'从执行计划来看,这个语句之所以慢是因为做了NESTED LOOPS之后再做的HASH UNIQUE
HASH UNIQUE 122 32 11104
NESTED LOOPS 120 30679 10645613
TABLE ACCESS FULL SCOTT KM_CMDOC_MAIN 3 9 2439
TABLE ACCESS BY INDEX ROWID SCOTT KM_CMDOC_REVIEW_HANDLER 13 3579 272004
INDEX RANGE SCAN SCOTT INDEX_FD_COMPANY_ID 0 32213 尝试通过提示改变执行计划看看是否可行
select /*+ use_hash(m,h) */ m.*
from km_cmdoc_main m
inner join (select distinct fd_cmdoc_id
from km_cmdoc_review_handler
where fd_company_id =
'139dc1399ef69959cd4e0a14395a3f8e') h
on m.fd_id = h.fd_cmdoc_id
where doc_status <> '10'
and fd_enter_system <> '02'
and fd_delete_type <> '02'