直方圖(histograms)
直方圖(histogram)本來是統計學概念,為什麼資料庫引入此概念,究其原因是因為透過直方圖最佳化器可以生成較好的執行計劃。
一旦對列建立了直方圖後,透過直方圖可以看到列值各個資料出現的頻率(注意這裡說的是頻率,並不一定是某數值出現的具體次數)。直方圖分為兩種型別:頻度直方圖以及高度平衡直方圖。頻度直方圖針對列有少量的不同值比較有效,當列中不同值的數目較大,建議使用高度平衡直方圖。Oracle會根據列中不同值的數量來自動判斷所要建立的直方圖型別。
依然拿上篇部落格的表為例子(http://blog.itpub.net/29827284/viewspace-2134398/)
一旦對列建立了直方圖後,透過直方圖可以看到列值各個資料出現的頻率(注意這裡說的是頻率,並不一定是某數值出現的具體次數)。直方圖分為兩種型別:頻度直方圖以及高度平衡直方圖。頻度直方圖針對列有少量的不同值比較有效,當列中不同值的數目較大,建議使用高度平衡直方圖。Oracle會根據列中不同值的數量來自動判斷所要建立的直方圖型別。
依然拿上篇部落格的表為例子(http://blog.itpub.net/29827284/viewspace-2134398/)
-
SQL> exec dbms_stats.gather_table_stats(USER,'T',method_opt=>'for columns skew size 11');
- SQL> select * from user_tab_histograms t where t.table_name='T' and COLUMN_NAME='SKEW';
-
TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_ACTUAL_VALUE
------------- ------------- --------------- -------------- ------------------------------
T SKEW 1 1
T SKEW 2 2
T SKEW 3 3
T SKEW 4 4
T SKEW 5 5
T SKEW 6 6
T SKEW 7 7
T SKEW 8 8
T SKEW 9 9
T SKEW 10 10
T SKEW 10000 10000
ENDPONIT_VALUE顯示的是列值
ENDPOINT_NUMBER顯示的是累積的行數更嚴格的說是累積的頻率。
為了計算一個特定列值的頻率要使用與它相關的endpoint_number值減去它之前的累計值。對於列SKEW中ENDPOINT_VALUE為10000,它對應的ENDPOINT_NUMBER=10000,上一個ENDPOINT_VALUE為10的ENDPOINT_NUMBER=10,那麼說明ENDPOINT_VALUE為10000有10000-10=9990條記錄。有了直方圖,可以讓最佳化器做出最優的執行計劃。廢話少說,透過實驗說明:
可以看出收集資訊建立了直方圖後,評估出的基數相對準確了很多,從而避免生成錯誤的執行計劃。為了更好的說明情況,可以在SKEW列建立索引
WHERE條件SKEW=1選擇走索引,WHERE條件SKEW=10000因為返回條目佔據了表的絕多部分記錄,Oracle選擇全表掃描,可以看出上面的兩條語句根據實際情況生成了非常完美的執行計劃。
ENDPOINT_NUMBER顯示的是累積的行數更嚴格的說是累積的頻率。
為了計算一個特定列值的頻率要使用與它相關的endpoint_number值減去它之前的累計值。對於列SKEW中ENDPOINT_VALUE為10000,它對應的ENDPOINT_NUMBER=10000,上一個ENDPOINT_VALUE為10的ENDPOINT_NUMBER=10,那麼說明ENDPOINT_VALUE為10000有10000-10=9990條記錄。有了直方圖,可以讓最佳化器做出最優的執行計劃。廢話少說,透過實驗說明:
點選(此處)摺疊或開啟
-
SQL> explain plan for select * from t where skew=1;
-
-
Explained.
-
-
SQL> SELECT * FROM table(dbms_xplan.display);
-
-
PLAN_TABLE_OUTPUT
-
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
Plan hash value: 1601196873
-
-
--------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-
--------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 1 | 7 | 7 (0)| 00:00:01 |
-
|* 1 | TABLE ACCESS FULL| T | 1 | 7 | 7 (0)| 00:00:01 |
-
--------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
---------------------------------------------------
-
- 1 - filter("SKEW"=1)
點選(此處)摺疊或開啟
-
SQL> explain plan for select * from t where skew=10000;
-
SQL> SELECT * FROM table(dbms_xplan.display);
-
-
PLAN_TABLE_OUTPUT
-
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
Plan hash value: 1601196873
-
-
--------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-
--------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 9990 | 69930 | 7 (0)| 00:00:01 |
-
|* 1 | TABLE ACCESS FULL| T | 9990 | 69930 | 7 (0)| 00:00:01 |
-
--------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
---------------------------------------------------
-
- 1 - filter("SKEW"=10000)
點選(此處)摺疊或開啟
-
SQL> create index ind_skew on t(skew);
-
-
Index created.
-
-
SQL> explain plan for select * from t where skew=1;
-
-
Explained.
-
-
SQL> SELECT * FROM table(dbms_xplan.display);
-
-
PLAN_TABLE_OUTPUT
-
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
Plan hash value: 3288809695
-
-
----------------------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-
----------------------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 1 | 7 | 2 (0)| 00:00:01 |
-
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 7 | 2 (0)| 00:00:01 |
-
|* 2 | INDEX RANGE SCAN | IND_SKEW | 1 | | 1 (0)| 00:00:01 |
-
----------------------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
---------------------------------------------------
-
-
2 - access("SKEW"=1)
-
-
14 rows selected.
-
-
SQL> explain plan for select * from t where skew=10000;
-
-
Explained.
-
-
SQL> SELECT * FROM table(dbms_xplan.display);
-
-
PLAN_TABLE_OUTPUT
-
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
Plan hash value: 1601196873
-
-
--------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-
--------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 9990 | 69930 | 7 (0)| 00:00:01 |
-
|* 1 | TABLE ACCESS FULL| T | 9990 | 69930 | 7 (0)| 00:00:01 |
-
--------------------------------------------------------------------------
-
-
Predicate Information (identified by operation id):
-
---------------------------------------------------
-
- 1 - filter("SKEW"=10000)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29827284/viewspace-2134417/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [zt] Histograms - 直方圖Histogram直方圖
- dba_histograms等高直方圖和等頻直方圖的理解Histogram直方圖
- Oracle直方圖 (柱狀圖 histograms) 詳解Oracle直方圖Histogram
- 直方圖Histograms與CRUSOR_SHARING直方圖Histogram
- search(13)- elastic4s-histograms:聚合直方圖ASTHistogram直方圖
- 直方圖直方圖
- 收集直方圖及檢視直方圖資訊直方圖
- HOG:用於人體檢測的梯度方向直方圖 Histograms of Oriented Gradients for Human DetectionHOG梯度直方圖Histogram
- 7.3 直方圖直方圖
- oracle 直方圖Oracle直方圖
- 直方圖均衡化直方圖
- 04:垂直直方圖直方圖
- oracle直方圖使用Oracle直方圖
- 直方圖學習直方圖
- Oracle直方圖解析Oracle直方圖圖解
- [20170615]直方圖-高度直方圖(11g).txt直方圖
- 直方圖中最大矩形直方圖
- Oracle直方圖詳解Oracle直方圖
- 【效能優化】直方圖優化直方圖
- [Python影象處理] 十一.灰度直方圖概念及OpenCV繪製直方圖Python直方圖OpenCV
- OpenCV計算機視覺學習(9)——影像直方圖 & 直方圖均衡化OpenCV計算機視覺直方圖
- oracle 柱狀圖(Histograms)OracleHistogram
- halcon-直方圖均衡直方圖
- python如何畫直方圖Python直方圖
- elasticsearch 之 histogram 直方圖聚合ElasticsearchHistogram直方圖
- oracle直方圖筆記-轉Oracle直方圖筆記
- 使用直方圖注意事項直方圖
- (轉)Oracle直方圖詳解Oracle直方圖
- Oracle直方圖詳解(ZT)Oracle直方圖
- 【沃趣科技】直方圖系列1直方圖
- Matplotlib直方圖繪製技巧直方圖
- opencv——影像直方圖與反向投影OpenCV直方圖
- 一文搞懂直方圖均衡直方圖
- 你知道直方圖都能幹啥?直方圖
- OpenCV之影象直方圖均衡化OpenCV直方圖
- 聊一聊MySQL的直方圖MySql直方圖
- oracle直方圖histogram小記(一)Oracle直方圖Histogram
- 轉貼oracle直方圖histogram(二)Oracle直方圖Histogram