對於沒有任何統計資訊的表,ORACLE可能會動態取樣。
今天給公司的人培訓的時候,遇到一個比較尷尬的事情。
我建立了一個測試表test.表欄位object_name的分佈如下:
SQL> select object_name,count(*) from test group by object_name;
OBJECT_NAME COUNT(*)
---------------------------------------- ----------
wxh 49784
test 9
然後再object_name上建立了一個普通索引
SQL>create index ind_name on test(object_name);
刪除表上的統計資訊:
SQL> BEGIN
2 DBMS_STATS.DELETE_TABLE_STATS(OWNNAME => 'SCOTT', TABNAME => 'TEST');
3 END;
4 /
PL/SQL 過程已成功完成。
檢視相關的幾個統計檢視,表的,列的,索引的,列直方圖的,統計資訊已經都沒了。
然後執行查詢:
SQL> select * from test where object_name='wxh';
已用時間: 00: 00: 00.02
執行計劃
----------------------------------------------------------
Plan hash value: 1357081020
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 44151 | 7631K| 196 (3)| 00:00:03 |
|* 1 | TABLE ACCESS FULL| TEST | 44151 | 7631K| 196 (3)| 00:00:03 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_NAME"='wxh')
Note
-----
- dynamic sampling used for this statement
SQL> select * from test where object_name='test';
已用時間: 00: 00: 00.01
執行計劃
----------------------------------------------------------
Plan hash value: 688048857
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9 | 1593 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 9 | 1593 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IND_NAME | 9 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_NAME"='test')
Note
-----
- dynamic sampling used for this statement
這裡輸出的結果和我的初衷是不一樣的:
我以為由於表列缺少直方圖資訊,ORACLE會都採取索引掃描或者都採取全表掃描。可是輸出的結果,ORACLE竟然都產生了正確的執行計劃。
[ 本帖最後由 wei-xh 於 2010-6-17 16:45 編輯 ]
我建立了一個測試表test.表欄位object_name的分佈如下:
SQL> select object_name,count(*) from test group by object_name;
OBJECT_NAME COUNT(*)
---------------------------------------- ----------
wxh 49784
test 9
然後再object_name上建立了一個普通索引
SQL>create index ind_name on test(object_name);
刪除表上的統計資訊:
SQL> BEGIN
2 DBMS_STATS.DELETE_TABLE_STATS(OWNNAME => 'SCOTT', TABNAME => 'TEST');
3 END;
4 /
PL/SQL 過程已成功完成。
檢視相關的幾個統計檢視,表的,列的,索引的,列直方圖的,統計資訊已經都沒了。
然後執行查詢:
SQL> select * from test where object_name='wxh';
已用時間: 00: 00: 00.02
執行計劃
----------------------------------------------------------
Plan hash value: 1357081020
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 44151 | 7631K| 196 (3)| 00:00:03 |
|* 1 | TABLE ACCESS FULL| TEST | 44151 | 7631K| 196 (3)| 00:00:03 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_NAME"='wxh')
Note
-----
- dynamic sampling used for this statement
SQL> select * from test where object_name='test';
已用時間: 00: 00: 00.01
執行計劃
----------------------------------------------------------
Plan hash value: 688048857
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9 | 1593 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 9 | 1593 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IND_NAME | 9 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_NAME"='test')
Note
-----
- dynamic sampling used for this statement
這裡輸出的結果和我的初衷是不一樣的:
我以為由於表列缺少直方圖資訊,ORACLE會都採取索引掃描或者都採取全表掃描。可是輸出的結果,ORACLE竟然都產生了正確的執行計劃。
[ 本帖最後由 wei-xh 於 2010-6-17 16:45 編輯 ]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-665556/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 臨時表(GLOBAL TEMPORARY TABLE)及統計資訊收集,動態取樣
- [Oracle] Oracle收集統計資訊的取樣比例Oracle
- Oracle 動態取樣Oracle
- 微課sql最佳化(6)、統計資訊收集(4)-關於動態取樣SQL
- Oracle11g,沒有統計資訊時,表的Card從哪來?Oracle
- CBO與動態統計量取樣
- Oracle動態取樣分析Oracle
- oracle 10g表沒有收集統計資訊的一點研究與思考Oracle 10g
- Oracle 分析及動態取樣Oracle
- Oracle動態取樣學習Oracle
- Oracle 執行計劃 分析和動態取樣Oracle
- 關於ORACLE自動統計CBO統計資訊Oracle
- 有沒有動態建立資料表的輪子?
- 示例說明動態取樣的作用,並演示動態取樣對有內在關係的多列查詢的影響
- ORACLE表統計資訊與列統計資訊Oracle
- 關於oracle自動收集統計資訊Oracle
- ORACLE表統計資訊與列統計資訊、索引統計資訊Oracle索引
- 關於ORACLE自動統計CBO統計資訊[轉帖]Oracle
- Oracle 分析及動態取樣(轉帖)Oracle
- 【AWR】測試AWR手動取樣對系統自動取樣的影響
- 重新收集oracle表的統計資訊Oracle
- 使用dbms_stats列出沒有統計資訊的物件!物件
- 【STATS】Oracle遷移表統計資訊Oracle
- 【原創】ORACLE 資料分析和動態取樣Oracle
- oracle檢視和更新統計表的資訊Oracle
- 沒有任何程式設計基礎可以製作系統軟體嗎?程式設計
- Oracle統計資訊自動收集Oracle
- index有時候可能會比表大!Index
- Steam:暫時不會對「正面的評測轟炸」採取任何行動
- 對於Linux系統統計的命令有哪些?怎樣系統的學習LinuxLinux
- 【統計資訊】Oracle統計資訊Oracle
- 如果沒有 Android,世界會怎樣?Android
- oracle動態取樣_optimizer_dynamic_samplingOracle
- 沒有整合的管理體系便沒有整合的資訊系統
- Oracle 11g 修改表級別的自動收集統計資訊比率Oracle
- 【YashanDB知識庫】收集分割槽表統計資訊取樣率小於1導致SQL執行計劃走偏SQL
- 關於dbms_stats對系統統計資訊的管理
- 11g組合索引的統計資訊會用於對錶返回基數的計算索引