Adaptive Cursor Sharing
先說說為什麼要搞出Adaptive Cursor Sharing這麼個東西。
11G以前一直存在一個問題,就是SQL在第一次硬解析的時候,最佳化器會窺探繫結變數的值,根據這個值來生成執行計劃。其實對於資料均勻分佈的情況來說,這個窺探也沒啥大問題,之所以說沒啥大問題,其實還是有我問題,我有點羅嗦了,那是因為範圍查詢的話情況就不一樣了,即使你的單個值沒傾斜分佈,但是範圍來說,也可能存在資料傾斜。比如你的id欄位最小值是1,最大值是1W,但是從2-9000都是沒有值的,那麼這樣的情況,如果你對id進行範圍查詢,也會涉及到執行計劃依賴於你傳輸的繫結變數。由於11G以前,在第一次窺探玩繫結變數後,執行計劃就產生在共享池裡了,後續的同樣的SQL都會使用這個執行計劃,而不去管傳入的值到底是什麼,現在的執行計劃是不適合這個變數值。
我很早就思考過這個問題,要解決這個問題,面臨幾個要解決的難題:
1)既然他們的執行計劃對繫結變數敏感,那麼就對有直方圖的列,每次都窺探他的值,如果執行計劃有變化,那麼就新生成一個執行計劃
2)上面的如果可行,那麼問題來了,現在對於這個SQL有2個執行計劃了,可是對於後續的SQL也還是每次都要去窺探繫結變數的值,然後生成執行計劃跟現有的比,還是有什麼巧妙的辦法?ORACLE搞了一個基數的概念出來,也就是v$sql_cs_selectivity 這個試圖內記錄的內容。對每個有資料傾斜的列計算一個選擇率出來,只要在某個選擇率範圍內的,就可以直接複用這個執行計劃。比如id=1執行計劃走了索引,選擇率是0.1,id=2經過計算也走了索引,選擇率是0.5,那麼後續來的所有SQL,經過計算後,只要選擇率在0.1-0.5之間的,都可以直接複用這個執行計劃。
上面的想法貌似不錯,但是存在一些問題:
1)每次都要對SQL裡涉及到直方圖的列,都要去窺探它的繫結變數,計算選擇率,代價還是比較高啊。其實對於大多數的列,即使存在直方圖,他們的執行計劃也是一樣的。為了解決這個問題,ORACLE設計出來了is_bind_sensitive,v$sql_cs_histogram 兩個東東,第一個值代表了這個值對於繫結變數是否敏感的,第二個檢視的作用,主要是用在如果由於這個列上的值的不同,導致結果集大範圍波動的,就在這個檢視的相關條目裡標記。
-----未完,待續
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-762834/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Adaptive Cursor Sharing(第五篇)APT
- Adaptive Cursor Sharing(第三篇)APT
- Adaptive Cursor Sharing(第四篇)APT
- Adaptive Cursor Sharing(第二篇)APT
- Adaptive Cursor Sharing (第一篇)APT
- [20221227]Adaptive Cursor Sharing & 直方圖.txtAPT直方圖
- 11G Adaptive Cursor Sharing(ACS)的研究APT
- Postgresql的CURSOR SHARINGSQL
- [20180803]cursor_sharing = force.txt
- [20202117]Function based indexes and cursor sharing.txtFunctionIndex
- [20210627]cursor_sharing=force與orade by.txt
- ORACLE中Cursor_sharing引數詳解Oracle
- [20220414]Function based indexes and cursor sharing2.txtFunctionIndex
- [20241012]cursor_sharing=force與函式索引.txt函式索引
- 初始化引數遊標之cursor_sharing
- [20201126]使用cursor_sharing_exact與給sql打補丁2.txtSQL
- [20201126]使用cursor_sharing_exact與給sql打補丁3.txtSQL
- Difference between cursor and a ref cursor
- [Vue] Sharing StateVue
- 【CURSOR】Oracle 遊標 (cursor)知識梳理Oracle
- Oracle CursorOracle
- Cursor使用
- Memory-Efficient Adaptive OptimizationAPT
- cursor_sharing=force強制繫結變數不會把變數值預設當成varchar2型別的理解變數型別
- PAT甲級1032 Sharing
- Lean Data Innovation Sharing Salon(2018.09.15)
- firefox css cursor handFirefoxCSS
- Oracle:cursor:mutex XOracleMutex
- iOS Sharing #01 | 2019-03-23iOS
- iOS Sharing #02 | 2019-03-30iOS
- iOS Sharing #03 | 2019-04-06iOS
- CSS滑鼠樣式(cursor)CSS
- cursor pin S wait on XAI
- cursor: pin S wait on XAI
- 提點效: 使用 Cursor
- Security Series: Cross-domain resource sharing CORSROSAICORS
- 哈哈,我好像知道 Cursor 為什麼叫 Cursor 了,真相竟然是。。。
- 【CURSOR】Oracle 子游標無法共享的原因之V$SQL_SHARED_CURSOROracleSQL
- Adaptive AUTOSAR 解決方案 INTEWORK-EAS-APAPT