1. 程式人生 > >SQL執行異常系列之——統計信息不準

SQL執行異常系列之——統計信息不準

_id wid ora dbms dbm predicate 計算 tput 圖片

作為一線的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執行異常系列之——統計信息不準