统计信息未收集引发的MERGE JOIN CARTESIAN
2013-04-07 16:10
441 查看
分析最近管理的一个系统的数据库报告看到一条SQL执行6次,平均执行时间为57s。检查了下SQL,发现语句并无错误,从执行计划中的rows=1来看,应该是统计信息没有收集。检查了下user_tables中的统计信息,确认是没有收集。语句执行速度提升了10倍。
执行统计信息后
SELECT * FROM (SELECT INNER_TABLE.*, ROWNUM OUTER_TABLE_ROWNUM FROM (SELECT EXPERIMENTWORK_PACKAGE.EXPERIMENTWORK_PACKAGE_ID, EXPERIMENT_WORK.WORK_ID, EXPERIMENT_WORK.STANDARD_PACKAGE_ID, EXPERIMENT_WORK.PERIOD_PLAN_ID, EXPERIMENT_WORK.WORK_NAME, EXPERIMENT_WORK.WORK_CODE, EXPERIMENT_WORK.SPECIALTY, EXPERIMENT_WORK.WORK_CHARACTER, EXPERIMENT_WORK.PLACE_ID, EXPERIMENT_WORK.PLACE_NAME, EXPERIMENT_WORK.PLACE_TYPE, EXPERIMENT_WORK.MASTER, EXPERIMENT_WORK.MASTER_ID, EXPERIMENT_WORK.DEPARTMENT_ID, EXPERIMENT_WORK.DEPARTMENT_NAME, EXPERIMENT_WORK.DEPARTMENT_CODE, EXPERIMENT_WORK.WORK_TEAM, EXPERIMENT_WORK.WORK_TEAM_CODE, EXPERIMENT_WORK.WORK_TEAM_ID, EXPERIMENT_WORK.WORK_PEASONS, EXPERIMENT_WORK.STANDARD_PACKAGE_NAME, EXPERIMENT_WORK.WORK_DESCR, EXPERIMENT_WORK.PLAN_FINISH_TIME, EXPERIMENT_WORK.CREATOR, EXPERIMENT_WORK.CREATOR_ID, EXPERIMENT_WORK.CREATE_TIME, EXPERIMENT_WORK.ACTUAL_START_TIME, EXPERIMENT_WORK.ACTUAL_FINISH_TIME, EXPERIMENT_WORK.WORK_RESULT, EXPERIMENT_WORK.IS_FIELD_WORK, EXPERIMENT_WORK.BACK_FLAG, EXPERIMENT_WORK.IS_INTERRUPTED, EXPERIMENT_WORK.IS_PLANNED, EXPERIMENT_WORK.FINISH_FLAG, EXPERIMENT_WORK.QUALIFIED_FLAG, EXPERIMENT_WORK.DEVICE_STATUS, EXPERIMENT_WORK.DEVICE_LOCATION, EXPERIMENT_WORK.STATE, EXPERIMENT_WORK.REMARK, EXPERIMENT_WORK.DATA_FROM, EXPERIMENT _WORK.INSTRUMENT_MODEL, EXPERIMENT_WORK.PERIOD_UPDATE_STATE, EXPERIMENT_WORK.IS_NEED_UPDATE, EXPERIMENT_WORK.IS_DEFECT, EXPERIMENT_WORK.TYPE, EXPERIMENT_WORK.LOCATION_ID, EXPERIMENT_WORK.FUNCTION_LOCATION_NAME, EXPERIMENT_WORK.BAY_NAME, EXPERIMENT_WORK.INSTRUMENT_CODE, EXPERIMENT_WORK.PLAN_BOUND, EXPERIMENT_WORK.MANAGE_DEPARTMENT_ID, EXPERIMENT_WORK.MANAGE_DEPARTMENT, EXPERIMENT_WORK.PLAN_START_TIME, EXPERIMENT_WORK.WORK_TYPE, EXPERIMENT_WORK.VEHICLE_NO, EXPERIMENT_WORK.IS_NEED_VEHICLE, EXPERIMENT_WORK.CENTER_SUBSTATION_ID, EXPERIMENT_WORK.CENTER_SUBSTATION_NAME, EXPERIMENT_WORK.VEHICLE_TIME, EXPERIMENT_WORK.MEMBER_NUM, EXPERIMENT_WORK.IS_SHARE_VEHICLE, EXPERIMENT_WORK.DRIVER, EXPERIMENT_WORK.DRIVER_ID, EXPERIMENT_WORK.SHARE_VEHICLE_TEAM, EXPERIMENT_WORK.CONTACT_WAY, EXPERIMENT_WORK.SHARE_VEHICLE_TEAM_IDS, EXPERIMENT_WORK.IS_COMMISSIONED, EXPERIMENT_WORK.COMMISSION_WORK_ID, EXPERIMENT_WORK.OBJECT_NUMBER, EXPERIMENT_WORK.WORK_STATUS, EXPERIMENT_WORK.IS_NEED_HIGH_VEHICLE, EXPERIMENT_WORK.HIGH_VEHICLE_DRIVER, EXPERIMENT_WORK.HIGH_VEHICLE_NO, EXPERIMENT_WORK.IS_SPECIFICSAFETOOL, EXPERIMENTWORK_PACKAGE.PACKAGE_NAME, EXPERIMENTWORK_PACKAGE.IS_PASSED, EXPERIMENTWORK_PACKAGE.Package_Id, STANDARD_PACKAGE.VERSION_NO, RP_EXPERIMENT_ENVIRONMENT.ENVIRONMENT_NAME, RP_EXPERIMENT_ENVIRONMENT.ENVIRONMEN TL_PLACE, RP_EXPERIMENT_ENVIRONMENT.ENVIRONMENT_CHARACTER, RP_EXPERIMENT_ENVIRONMENT.ENVIRONMENT_DATE, RP_EXPERIMENT_ENVIRONMENT.ENVIRONMENT_CONCLUSION FROM EXPERIMENT_WORK, EXPERIMENTWORK_PACKAGE, RP_EXPERIMENT_ENVIRONMENT, STANDARD_PACKAGE, RP_REPORT_INSTANCE_OBJECT WHERE EXPERIMENT_WORK.WORK_ID = EXPERIMENTWORK_PACKAGE.WORK_ID AND RP_REPORT_INSTANCE_OBJECT.EXPERIMENTWORK_PACKAGE_ID = EXPERIMENTWORK_PACKAGE.EXPERIMENTWORK_PACKAGE_ID AND RP_REPORT_INSTANCE_OBJECT.REPORT_INSTANCE_OBJECT_ID = RP_EXPERIMENT_ENVIRONMENT.REPORT_INSTANCE_OBJECT_ID(+) AND EXPERIMENTWORK_PACKAGE.PACKAGE_ID = STANDARD_PACKAGE.STANDARD_PACKAGE_ID AND EXISTS (SELECT C.CATALOG_ID FROM STANDARD_CATALOG C WHERE C.CATALOG_ID = STANDARD_PACKAGE.CATALOG_ID START WITH C.PARENT_ID = 0 CONNECT BY PRIOR C.CATALOG_ID = C.PARENT_ID) AND (RP_EXPERIMENT_ENVIRONMENT.ENVIRONMENT_CONCLUSION = :1 OR RP_EXPERIMENT_ENVIRONMENT.ENVIRONMENT_CONCLUSION = :2) AND RP_EXPERIMENT_ENVIRONMENT.ENVIRONMENT_CHARACTER like :3 AND STANDARD_PACKAGE.STANDARD_PACKAGE_NO = :4 AND RP_EXPERIMENT_ENVIRONMENT.ENVIRONMENT_DATE >= :5 AND RP_EXPERIMENT_ENVIRONMENT.ENVIRONMENT_DATE <= :6 AND EXPERIMENT_WORK.SPECIALTY = :7 AND EXPERIMENT_WORK.WORK_TEAM_ID = :8 ORDER BY RP_EXPERIMENT_ENVIRONMENT.ENVIRONMENT_DATE asc nulls last) INNER_TABLE WHERE ROWNUM <= 18) OUTER_TABLE WHERE OUTER_TABLE_ROWNUM > 0; 已用时间: 00: 00: 06.93 执行计划 -------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ---------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 8520 | 38 (3)| | 1 | VIEW | | 1 | 8520 | 38 (3)| | 2 | COUNT STOPKEY | | | | | | 3 | VIEW | | 1 | 8507 | 38 (3)| | 4 | SORT ORDER BY STOPKEY | | 1 | 567 | 38 (3)| | 5 | FILTER | | | | | | 6 | NESTED LOOPS | | 1 | 567 | 34 (0)| | 7 | NESTED LOOPS | | 1 | 542 | 33 (0)| | 8 | MERGE JOIN CARTESIAN | | 1 | 507 | 32 (0)| | 9 | NESTED LOOPS | | 1 | 119 | 14 (0)| | 10 | TABLE ACCESS FULL | RP_EXPERIMENT_ENVIRONMENT | 1 | 77 | 13 (0)| | 11 | TABLE ACCESS BY INDEX ROWID| RP_REPORT_INSTANCE_OBJECT | 1 | 42 | 1 (0)| | 12 | INDEX UNIQUE SCAN | PK_RP_REPORT_INSTANCE_OBJECT | 1 | | 1 (0)| | 13 | BUFFER SORT | | 10 | 3880 | 31 (0)| | 14 | TABLE ACCESS FULL | EXPERIMENT_WORK | 10 | 3880 | 18 (0)| | 15 | TABLE ACCESS BY INDEX ROWID | EXPERIMENTWORK_PACKAGE | 1 | 35 | 1 (0)| | 16 | INDEX RANGE SCAN | IDX_WORK_ID | 2 | | 1 (0)| | 17 | TABLE ACCESS BY INDEX ROWID | STANDARD_PACKAGE | 1 | 25 | 1 (0)| | 18 | INDEX UNIQUE SCAN | PK_STANDARD_PACKAGE | 1 | | 1 (0)| | 19 | FILTER | | | | | | 20 | CONNECT BY WITH FILTERING | | | | | | 21 | FILTER | | | | | | 22 | TABLE ACCESS FULL | STANDARD_CATALOG | 192 | 1536 | 3 (0)| | 23 | HASH JOIN | | | | | | 24 | CONNECT BY PUMP | | | | | | 25 | TABLE ACCESS FULL | STANDARD_CATALOG | 192 | 1536 | 3 (0)| | 26 | TABLE ACCESS FULL | STANDARD_CATALOG | 192 | 1536 | 3 (0)| ----------------------------------------------------------------------------------------------------------
统计信息 ---------------------------------------------------------- 1 recursive calls 0 db block gets 1159757 consistent gets 0 physical reads 0 redo size 6782 bytes sent via SQL*Net to client 5334 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 86 sorts (memory) 0 sorts (disk) 18 rows processed
执行统计信息后
已用时间: 00: 00: 00.68 执行计划 ------------------------------------------------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| --------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 8520 | 497 (2)| | 1 | VIEW | | 1 | 8520 | 497 (2)| | 2 | COUNT STOPKEY | | | | | | 3 | VIEW | | 1 | 8507 | 497 (2)| | 4 | SORT ORDER BY STOPKEY | | 1 | 618 | 497 (2)| | 5 | FILTER | | | | | | 6 | NESTED LOOPS | | 1 | 618 | 493 (1)| | 7 | HASH JOIN | | 1 | 589 | 492 (1)| | 8 | TABLE ACCESS FULL | RP_EXPERIMENT_ENVIRONMENT | 8 | 608 | 139 (1)| | 9 | HASH JOIN | | 1003 | 502K| 352 (1)| | 10 | NESTED LOOPS | | 997 | 458K| 268 (1)| | 11 | TABLE ACCESS FULL | EXPERIMENT_WORK | 510 | 214K| 166 (1)| | 12 | TABLE ACCESS BY INDEX ROWID| EXPERIMENTWORK_PACKAGE | 2 | 82 | 1 (0)| | 13 | INDEX RANGE SCAN | IDX_WORK_ID | 2 | | 1 (0)| | 14 | TABLE ACCESS FULL | RP_REPORT_INSTANCE_OBJECT | 24463 | 1003K| 84 (2)| | 15 | TABLE ACCESS BY INDEX ROWID | STANDARD_PACKAGE | 1 | 29 | 1 (0)| | 16 | INDEX UNIQUE SCAN | PK_STANDARD_PACKAGE | 1 | | 1 (0)| | 17 | FILTER | | | | | | 18 | CONNECT BY WITH FILTERING | | | | | | 19 | FILTER | | | | | | 20 | TABLE ACCESS FULL | STANDARD_CATALOG | 218 | 1744 | 3 (0)| | 21 | HASH JOIN | | | | | | 22 | CONNECT BY PUMP | | | | | | 23 | TABLE ACCESS FULL | STANDARD_CATALOG | 218 | 1744 | 3 (0)| | 24 | TABLE ACCESS FULL | STANDARD_CATALOG | 218 | 1744 | 3 (0)| -----------------------------------------------------------------------------------------------
统计信息 ---------------------------------------------------------- 1 recursive calls 0 db block gets 8804 consistent gets 0 physical reads 0 redo size 6811 bytes sent via SQL*Net to client 5334 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 85 sorts (memory) 0 sorts (disk) 18 rows processed
相关文章推荐
- 由在EBS中收集分区表统计信息引发的思考
- 统计信息未自动收集引发的性能问题
- Oracle 11g系统自动收集统计信息的一些知识
- greenplum 收集统计信息
- 收集oracle统计信息
- 收集统计信息中的no_invalidate选项对执行计划的影响
- Sybase数据库收集表及其索引的统计信息
- ORACLE 收集统计信息
- oracle 收集统计信息(除去备份表)
- 收集oracle统计信息1
- 自动收集统计信息Auto Maintenance Tasks和动态采样optimizer_dynamic_sampling
- [zt] Oracle 10g 统计信息自动收集功能(automatic statistics gathering)
- Oracle 12c数据库优化器统计信息收集的最佳实践(三)|何时不需要收集统计信息
- ORACLE 收集统计信息
- 如何关闭和打开oracle 10g自动收集统计信息功能
- 10G之后统计信息收集后为什么执行计划不会被立马淘汰
- Oracle 判断 并 手动收集 统计信息 脚本
- 11g 自动收集统计信息
- Oracle之自动收集统计信息
- STATSPACK收集统计信息-调整报告