直方圖Histograms與CRUSOR_SHARING
有時候可以將cursor_sharing設定為similar來降低由於沒有使用繫結變數導致硬解析過高的問題。
可是它有個副作用,如果等值查詢的列上存在直方圖,ORACLE就會認為=後面的變數產生的CURSOR都是危險的,進而導致硬解釋。
且version_count增加。
簡單實驗如下:
建立測試表
SQL>create table test as select * from dba_objects;
分析表
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'TEST',
CASCADE => TRUE,
METHOD_OPT => 'FOR ALL COLUMNS SIZE auto');
END;
檢視Dba_Histograms檢視
SQL>SELECT * FROM Dba_Histograms WHERE table_name='TEST';(輸出結果略)
發現object_id列上已經存在了直方圖。
SQL>alter system set cursor_sharing='similar';
查詢test表:
SQL>select * from test where object_id=1;
透過V$SQL得到這個語句的sql_id,然後可以透過v$sqlarea的version_count欄位,觀察變化。
object_id的改變都會導致version_ count加1。
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
1
SQL>select * from test where object_id=15;
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
2
SQL>select * from test where object_id=10;
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
3
我們取消直方圖看看是什麼效果:
exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname => 'TEST1',cascade => TRUE,method_opt => 'FOR COLUMNS OBJECT_ID SIZE 1');
繼續實驗:
SQL>select * from test where object_id=30;
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
3
SQL>select * from test where object_id=50;
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
3
SQL>select * from test where object_id=60;
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
3
version_count不再變化了。
有幾個概念需要解釋一下,方便菜鳥級的理解本貼:
一個語句能否被共享,需要滿足parent cursor和child cursor都可以被共享才行。
parent cursor:儲存的是sql語句的文字。
chlid cursor:儲存的是解析計劃和環境資訊。
在本案例中,都是chlid cursor沒有被共享導致的硬解析。
version_count過高的壞處就是,可能會導致library cache latch競爭。每次執行sql前都需要到library cache中先查詢parent cursor是否可以共享,如果可以共享,繼續查詢child cursor是否可以共享,如果可以就是軟解析,否則為硬解析。這個過程裡,是需要獲得library cache latch的,如果version_count過多,就會導致搜尋過程變長,佔用library cache latch時間就會變長,這在高併發的資料庫中很可能就是災難(latch的序列機制。)
[ 本帖最後由 wei-xh 於 2010-5-2 20:42 編輯 ]
可是它有個副作用,如果等值查詢的列上存在直方圖,ORACLE就會認為=後面的變數產生的CURSOR都是危險的,進而導致硬解釋。
且version_count增加。
簡單實驗如下:
建立測試表
SQL>create table test as select * from dba_objects;
分析表
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'TEST',
CASCADE => TRUE,
METHOD_OPT => 'FOR ALL COLUMNS SIZE auto');
END;
檢視Dba_Histograms檢視
SQL>SELECT * FROM Dba_Histograms WHERE table_name='TEST';(輸出結果略)
發現object_id列上已經存在了直方圖。
SQL>alter system set cursor_sharing='similar';
查詢test表:
SQL>select * from test where object_id=1;
透過V$SQL得到這個語句的sql_id,然後可以透過v$sqlarea的version_count欄位,觀察變化。
object_id的改變都會導致version_ count加1。
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
1
SQL>select * from test where object_id=15;
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
2
SQL>select * from test where object_id=10;
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
3
我們取消直方圖看看是什麼效果:
exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname => 'TEST1',cascade => TRUE,method_opt => 'FOR COLUMNS OBJECT_ID SIZE 1');
繼續實驗:
SQL>select * from test where object_id=30;
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
3
SQL>select * from test where object_id=50;
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
3
SQL>select * from test where object_id=60;
SQL>SELECT version_count FROM v$sqlarea WHERE sql_id='dd0u25bgmr2rj';
VERSION_COUNT
-------------
3
version_count不再變化了。
有幾個概念需要解釋一下,方便菜鳥級的理解本貼:
一個語句能否被共享,需要滿足parent cursor和child cursor都可以被共享才行。
parent cursor:儲存的是sql語句的文字。
chlid cursor:儲存的是解析計劃和環境資訊。
在本案例中,都是chlid cursor沒有被共享導致的硬解析。
version_count過高的壞處就是,可能會導致library cache latch競爭。每次執行sql前都需要到library cache中先查詢parent cursor是否可以共享,如果可以共享,繼續查詢child cursor是否可以共享,如果可以就是軟解析,否則為硬解析。這個過程裡,是需要獲得library cache latch的,如果version_count過多,就會導致搜尋過程變長,佔用library cache latch時間就會變長,這在高併發的資料庫中很可能就是災難(latch的序列機制。)
[ 本帖最後由 wei-xh 於 2010-5-2 20:42 編輯 ]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-662228/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 直方圖(histograms)直方圖Histogram
- [zt] Histograms - 直方圖Histogram直方圖
- dba_histograms等高直方圖和等頻直方圖的理解Histogram直方圖
- Oracle直方圖 (柱狀圖 histograms) 詳解Oracle直方圖Histogram
- search(13)- elastic4s-histograms:聚合直方圖ASTHistogram直方圖
- 直方圖直方圖
- 收集直方圖及檢視直方圖資訊直方圖
- opencv——影像直方圖與反向投影OpenCV直方圖
- HOG:用於人體檢測的梯度方向直方圖 Histograms of Oriented Gradients for Human DetectionHOG梯度直方圖Histogram
- 7.3 直方圖直方圖
- oracle 直方圖Oracle直方圖
- 直方圖均衡化原理與實現直方圖
- col_usage$與直方圖的收集直方圖
- cursor_sharing=similar 與 直方圖MILA直方圖
- 直方圖均衡化直方圖
- 04:垂直直方圖直方圖
- oracle直方圖使用Oracle直方圖
- 直方圖學習直方圖
- Oracle直方圖解析Oracle直方圖圖解
- [20170615]直方圖-高度直方圖(11g).txt直方圖
- 直方圖中最大矩形直方圖
- Oracle直方圖詳解Oracle直方圖
- 【效能優化】直方圖優化直方圖
- Cursor_sharing=SIMILAR取值與直方圖(上)MILA直方圖
- Cursor_sharing=SIMILAR取值與直方圖(下)MILA直方圖
- 【效能優化】執行計劃與直方圖優化直方圖
- [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直方圖繪製技巧直方圖