ORACLE数据库SQL优化 not in 与not exits
2017-10-18 10:16
369 查看
各个表的数据量:
sys_file_convert_queue 65989
sys_att_file 73061
sys_att_main 84405
sys_att_rtf_data 1507
优化前,执行时间大概2分多钟 SQL> set autotrace traceonly SQL> delete from sys_file_convert_queue 2 where ((fd_file_id is not null or fd_file_id <> '') and 3 fd_file_id not in (select fd_id from sys_att_file)) 4 or fd_attmain_id not in 5 (select fd_id 6 from sys_att_main 7 union all 8 select fd_id from sys_att_rtf_data); 0 rows deleted. Execution Plan ---------------------------------------------------------- Plan hash value: 3784236352 -------------------------------------------------------------------------------- --------------- | Id | Operation | Name | Rows | Bytes | Cost (%C PU)| Time | -------------------------------------------------------------------------------- --------------- | 0 | DELETE STATEMENT | | 64436 | 9879K| 125K (1)| 00:25:11 | | 1 | DELETE | SYS_FILE_CONVERT_QUEUE | | | | | |* 2 | FILTER | | | | | | | 3 | TABLE ACCESS FULL | SYS_FILE_CONVERT_QUEUE | 64437 | 9879K| 869 (1)| 00:00:11 | | 4 | UNION-ALL | | | | | | |* 5 | INDEX UNIQUE SCAN| SYS_C0015191 | 1 | 33 | 1 (0)| 00:00:01 | |* 6 | INDEX UNIQUE SCAN| SYS_C0015192 | 1 | 33 | 1 (0)| 00:00:01 | |* 7 | INDEX FULL SCAN | SYS_C0014984 | 1 | 33 | 405 (1)| 00:00:05 | -------------------------------------------------------------------------------- --------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter( NOT EXISTS ( (SELECT "FD_ID" FROM "SYS_ATT_MAIN" "SYS_ATT_MAIN" W HERE "FD_ID"=:B1) UNION ALL (SELECT "FD_ID" FROM "SYS_ATT_RTF_DATA" "S YS_ATT_RTF_DATA" WHERE "FD_ID"=:B2)) OR ("FD_FILE_ID" IS NOT NULL OR "FD_FILE_ID"<> '') AND NOT EXISTS (SELECT 0 FROM "SYS_ATT_FILE" "SYS_ATT_FILE" WHERE LNNVL("FD_ID"<> :B3))) 5 - access("FD_ID"=:B1) 6 - access("FD_ID"=:B1) 7 - filter(LNNVL("FD_ID"<>:B1)) Statistics ---------------------------------------------------------- 94 recursive calls 0 db block gets 14521723 consistent gets 960 physical reads 116 redo size 832 bytes sent via SQL*Net to client 1052 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 22 sorts (memory) 0 sorts (disk) 0 rows processed
优化后,执行时间2秒不到 SQL> delete from sys_file_convert_queue a 2 where not exists 3 (select fd_id from sys_att_file b where a.fd_file_id = b.fd_id) 4 or not exists (select 1 5 from (select fd_id 6 from sys_att_main 7 union all 8 select fd_id from sys_att_rtf_data) c 9 where a.fd_attmain_id = c.fd_id) 10 ; 0 rows deleted. Execution Plan ---------------------------------------------------------- Plan hash value: 831590816 -------------------------------------------------------------------------------- ---------------- | Id | Operation | Name | Rows | Bytes | Cost (% CPU)| Time | -------------------------------------------------------------------------------- ---------------- | 0 | DELETE STATEMENT | | 64436 | 9879K| 63392 (1)| 00:12:41 | | 1 | DELETE | SYS_FILE_CONVERT_QUEUE | | | | | |* 2 | FILTER | | | | | | | 3 | TABLE ACCESS FULL | SYS_FILE_CONVERT_QUEUE | 64437 | 9879K| 868 (1)| 00:00:11 | |* 4 | INDEX UNIQUE SCAN | SYS_C0014984 | 1 | 33 | 1 (0)| 00:00:01 | | 5 | VIEW | | 2 | 148 | 2 (0)| 00:00:01 | | 6 | UNION-ALL | | | | | | |* 7 | INDEX UNIQUE SCAN| SYS_C0015191 | 1 | 33 | 1 (0)| 00:00:01 | |* 8 | INDEX UNIQUE SCAN| SYS_C0015192 | 1 | 33 | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------- ---------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter( NOT EXISTS (SELECT 0 FROM "SYS_ATT_FILE" "B" WHERE "B"."FD_ID"=:B 1) OR NOT EXISTS (SELECT 0 FROM ( (SELECT "FD_ID" "FD_ID" FROM "SYS_ATT _MAIN" "SYS_ATT_MAIN" WHERE "FD_ID"=:B2) UNION ALL (SELECT "FD_ID" "FD_ID" FROM "SYS_AT T_RTF_DATA" "SYS_ATT_RTF_DATA" WHERE "FD_ID"=:B3)) "C")) 4 - access("B"."FD_ID"=:B1) 7 - access("FD_ID"=:B1) 8 - access("FD_ID"=:B1) Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 243938 consistent gets 0 physical reads 0 redo size 837 bytes sent via SQL*Net to client 1099 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 0 rows processed
相关文章推荐
- oracle数据库sql优化原理
- PL/SQL连接Oracle数据库提示&quot;TNS:could not resolve the connect identifier spe
- Oracle sql"NOT IN"语句优化,查询A表有、B表没有的数据
- SQLServer 优化SQL语句 in 和not in的替代方案
- ORACLE数据库SQL优化--->如何得到真实的执行计划
- sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句
- SQL语句中in not in exits not exits用法比较
- SQLServer 优化SQL语句 in 和not in的替代方案
- Oracle数据库中SQL语句的优化技巧
- ORACLE数据库SQL优化--->Oracle表连接类型
- SQL语句中的NOT IN 的优化
- sql优化,in与exist , not in与not exist 的区别
- SQL语句优化一例 row_number not in or
- 【SQL优化】不要使用not in
- ORACLE-017:SQL优化-is not null和nvl
- sql语句优化--用EXISTS替代IN、用NOT EXISTS替代NOT IN
- oracle数据库优化辅助SQL语句
- Sql语句优化之用exists、not exists替代in、not in
- SQLServer 优化SQL语句:in 和not in的替代方案
- sql优化not in