SQL執行異常系列之——統計信息不準
作為一線的dba,經常會遇到批量業務或聯機業務sql中統計信息不準導致的執行計劃異常的問題。雖較為常見,但還是記錄一下,作為SQL執行異常專題的開篇一章。要了解執行計劃,首先要理解統計信息,因為ORACLE主要是基於表的統計信息計算表訪問、過濾、表關聯的消耗,從而生成最終的執行計劃,如果表的統計信息不準,自然而然也就會影響最終sql的執行結果。
一、統計信息的分類
二、在以上統計信息中,有關表的統計信息不準導致的執行計劃存在異常的現象最為常見:
SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------------------------- Plan hash value: 3251985671 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 23 | 344 (0)| 00:00:05 | | 1 | NESTED LOOPS | | 1 | 23 | 344 (0)| 00:00:05 | | 2 | TABLE ACCESS FULL| STATIC_TEST1 | 1 | 18 | 343 (0)| 00:00:05 | |* 3 | INDEX RANGE SCAN | STATIC_TEST_IDX | 1 | 5 | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("A"."OBJECT_ID"="B"."OBJECT_ID") 15 rows selected. SQL> explain plan for select a.object_name,b.object_id from static_test a,static_test1 b where a.object_id=b.object_id; 2 3 Explained. SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------- Plan hash value: 1637592733 ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 35 | 344 (0)| 00:00:05 | | 1 | NESTED LOOPS | | 1 | 35 | 344 (0)| 00:00:05 | | 2 | NESTED LOOPS | | 1 | 35 | 344 (0)| 00:00:05 | | 3 | TABLE ACCESS FULL | STATIC_TEST1 | 1 | 5 | 343 (0)| 00:00:05 | |* 4 | INDEX RANGE SCAN | STATIC_TEST_IDX | 1 | | 1 (0)| 00:00:01 | | 5 | TABLE ACCESS BY INDEX ROWID| STATIC_TEST | 1 | 30 | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("A"."OBJECT_ID"="B"."OBJECT_ID") 17 rows selected.
SQL> explain plan for select a.object_name,b.object_id
from static_test a,static_test1 b
where a.object_id=b.object_id; 2 3
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
Plan hash value: 1637592733
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 35 | 344 (0)| 00:00:05 |
| 1 | NESTED LOOPS | | 1 | 35 | 344 (0)| 00:00:05 |
| 2 | NESTED LOOPS | | 1 | 35 | 344 (0)| 00:00:05 |
| 3 | TABLE ACCESS FULL | STATIC_TEST1 | 1 | 5 | 343 (0)| 00:00:05 |
|* 4 | INDEX RANGE SCAN | STATIC_TEST_IDX | 1 | | 1 (0)| 00:00:01 |
| 5 | TABLE ACCESS BY INDEX ROWID| STATIC_TEST | 1 | 30 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
17 rows selected.
SQL執行異常系列之——統計信息不準