Oracle 11g新特性之收集多列統計資訊
通常,當我們將SQL語句提交給Oracle資料庫時,Oracle會選擇一種最優方式來執行,這是透過查詢最佳化器Query Optimizer來實現的。CBO(Cost-Based Optimizer)是Oracle預設使用的查詢最佳化器模式。在CBO中,SQL執行計劃的生成,是以一種尋找成本(Cost)最優為目標導向的執行計劃探索過程。所謂成本(Cost)就是將CPU和IO消耗整合起來的量化指標,每一個執行計劃的成本就是經過最佳化器內部公式估算出的數字值。
我們在寫SQL語句的時候,經常會碰到where子句後面有多個條件的情況,也就是根據多列的條件篩選得到資料。預設情況下,oracle會把多列的選擇率(selectivity)相乘從而得到where語句的選擇率,這樣有可能造成選擇率(selectivity)不準確,從而導致最佳化器做出錯誤的判斷。為了能夠讓最佳化器做出準確的判斷,從而生成準確的執行計劃,oracle在11g資料庫中引入了收集多列統計資訊。本文透過對測試表的多條件查詢,介紹收集多列統計資訊的重要性。1.環境準備
我們在Oracle 11g中進行試驗。點選(此處)摺疊或開啟
-
SQL>
-
SQL> select * from v$version;
-
-
BANNER
-
--------------------------------------------------------------------------------
-
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
-
PL/SQL Release 11.2.0.3.0 - Production
-
CORE 11.2.0.3.0 Production
-
TNS for Linux: Version 11.2.0.3.0 - Production
-
NLSRTL Version 11.2.0.3.0 - Production
-
- SQL>
點選(此處)摺疊或開啟
-
SQL>
-
SQL> conn hr/hr
-
Connected.
-
SQL>
-
SQL> create table hoegh as select * from employees;
-
-
Table created.
-
-
SQL> select count(*) from hoegh;
-
-
COUNT(*)
-
----------
-
107
-
-
SQL>
-
SQL> insert into hoegh select * from hoegh;
-
-
107 rows created.
-
-
SQL> /
-
-
214 rows created.
-
-
SQL> /
-
-
428 rows created.
-
-
SQL> /
-
-
856 rows created.
-
-
SQL> commit;
-
-
Commit complete.
-
-
SQL> select count(*) from hoegh;
-
-
COUNT(*)
-
----------
-
1712
-
- SQL>
2.按照常規方法收集統計量資訊;
點選(此處)摺疊或開啟
-
SQL>
-
SQL> exec dbms_stats.gather_table_stats(\'HR\',\'HOEGH\');
-
-
PL/SQL procedure successfully completed.
-
- SQL>
3.檢視執行單個條件的where語句的執行計劃
點選(此處)摺疊或開啟
-
SQL>
-
SQL> explain plan for select * from hoegh where employee_id=110;
-
-
Explained.
-
-
SQL> select * from table(dbms_xplan.display);
-
-
PLAN_TABLE_OUTPUT
-
--------------------------------------------------------------------------------
-
Plan hash value: 774871165
-
-
---------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-
---------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 16 | 1104 | 8 (0)| 00:00:01 |
-
|* 1 | TABLE ACCESS FULL| HOEGH | 16 | 1104 | 8 (0)| 00:00:01 |
-
---------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
---------------------------------------------------
-
-
PLAN_TABLE_OUTPUT
-
--------------------------------------------------------------------------------
-
-
1 - filter(\"EMPLOYEE_ID\"=110)
-
-
13 rows selected.
-
- SQL>
選擇率(selectivity)=在本例中是 1/唯一值
返回行數=選擇率(selectivity)*表記錄總數
也就是說,在這個查詢語句中,選擇率=1/107,返回行數=1/107*1712=16
4.檢視執行兩個條件的where語句的執行計劃
點選(此處)摺疊或開啟
-
SQL>
-
SQL> explain plan for select * from hoegh where employee_id=110 and email=\'JCHEN\';
-
-
Explained.
-
-
SQL>
-
SQL> select * from table(dbms_xplan.display);
-
-
PLAN_TABLE_OUTPUT
-
--------------------------------------------------------------------------------
-
Plan hash value: 774871165
-
-
---------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-
---------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 1 | 69 | 8 (0)| 00:00:01 |
-
|* 1 | TABLE ACCESS FULL| HOEGH | 1 | 69 | 8 (0)| 00:00:01 |
-
---------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
---------------------------------------------------
-
-
PLAN_TABLE_OUTPUT
-
--------------------------------------------------------------------------------
-
-
1 - filter(\"EMPLOYEE_ID\"=110 AND \"EMAIL\"=\'JCHEN\')
-
-
13 rows selected.
-
- SQL>
點選(此處)摺疊或開啟
-
SQL> select count(*) from hoegh where employee_id=110 and email=\'JCHEN\';
-
-
COUNT(*)
-
----------
-
16
-
- SQL>
在這個多列條件查詢語句中,選擇率=1/107*1/107,返回行數=1/107*1/107*1712=16/107<1;由於表中存在符合條件的記錄,並且返回行數不可能小於1,所以Oracle返回了1。
5.收集多列統計資訊,再次檢視兩個條件的where語句的執行計劃
點選(此處)摺疊或開啟
從執行計劃的結果來看,同樣的一條sql查詢語句,在收集多列統計資訊後,Oracle的選擇率(selectivity)由錯變對,這是由於sql語句中的兩個條件是有關聯的,即employee_id和email在employees表中都是唯一的,都可以唯一標識一行記錄;而在收集多列統計資訊之前,Oracle並不知道這兩個查詢條件有關聯,所以在計算選擇率(selectivity)時,只是簡單地採取了相乘的方法。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-2145302/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 11g新特性:多列統計資訊(MultiColumn Statistics)Oracle
- Oracle 12c新特性之檢測有用的多列統計資訊Oracle
- Oracle 11g 之自動收集統計資訊Oracle
- ORACLE19c新特性-實時統計資訊收集Oracle
- oracle 11g統計資訊收集Oracle
- 【Oracle】11g Oracle自動收集統計資訊Oracle
- Oracle 11g手工收集表統計資訊Oracle
- Oracle 11g 統計資訊收集指令碼Oracle指令碼
- ORACLE 11g 自動收集統計資訊Oracle
- Oracle多列統計資訊Oracle
- 11G新特性,比較統計資訊
- 11G新特性,待定的統計資訊
- Oracle收集統計資訊Oracle
- Oracle 統計資訊收集Oracle
- 收集oracle統計資訊Oracle
- ORACLE 收集統計資訊Oracle
- [統計資訊系列7] Oracle 11g的自動統計資訊收集Oracle
- Oracle 11g無法自動收集統計資訊Oracle
- oracle 11g自動收集統計資訊介紹Oracle
- ORACLE 11g新特性-統計值掛起Oracle
- Oracle 11g 新特性之DRCPOracle
- Oracle 11g新特性之SecureFilesOracle
- 【統計資訊】Oracle常用的收集統計資訊方式Oracle
- Oracle收集統計資訊之NO_INVALIDATE引數Oracle
- Oracle檢視查詢慢之統計資訊收集Oracle
- Oracle統計資訊自動收集Oracle
- oracle收集統計資訊job停止Oracle
- oracle 統計資訊檢視與收集Oracle
- ORACLE 統計資訊的收集與管理Oracle
- 【ORACLE新特性】11G 分割槽新特性Oracle
- ORACLE表統計資訊與列統計資訊Oracle
- Oracle 11g 修改表級別的自動收集統計資訊比率Oracle
- Oracle 11g 建立臨時window時間視窗 收集統計資訊Oracle
- Oracle 11g 新特性Oracle
- [Oracle] Oracle收集統計資訊的取樣比例Oracle
- Oracle 11g系統自動收集統計資訊的一些知識Oracle
- ORACLE表統計資訊與列統計資訊、索引統計資訊Oracle索引
- Oracle 11g的多列統計(Multi Column)值(上)Oracle