亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

何時Oracle使用綁定變量性能反而更差

2024-08-29 13:50:58
字體:
來源:轉載
供稿:網友
當我在做培訓時,在解釋綁定變量的好處時,大家都比較輕易理解。但是,對于并不是任何時候綁定變量都是最優的。這一點很多人不是和理解。下面就討論一下在什么時候會出現綁定變量會使性能變差。 掃描成本和OPTIMIZER_INDEX_COST_ADJ 我們知道,在CBO模式下,Oracle會計算各個訪問路徑的代價,采用最小代價的訪問路徑作為語句的執行計劃。而對于索引的訪問代價的計算,需要根據一個系統參數OPTIMIZER_INDEX_COST_ADJ來轉換為與全表掃描代價等價的一個值。這是什么意思呢?我們先稍微解釋一下這個參數:OPTIMIZER_INDEX_COST_ADJ。它的值是一個百分比,默認是100,取值范圍是1~10000。當估算索引掃描代價時,會將索引的原始代價值乘以這個百分比,將換算后的值作為與全表掃描代價比較的值。也就是說,當這個值為100時,計算出的索引掃描代價就是它的原始代價:
COST_COM = COST_ORG * OPTIMIZER_INDEX_COST_ADJ/100
看以下例子:
SQL> create table T_PEEKING (a NUMBER, b char(1), c char(2000)); Table created. SQL>SQL> create index T_PEEKING_IDX1 on T_PEEKING(b); Index created. SQL> begin 2 for i in 1..1000 loop 3 insert into T_PEEKING values (i, 'A', i); 4 end loop; 5 6 insert into T_PEEKING values (1001, 'B', 1001); 7 insert into T_PEEKING values (1002, 'B', 1002); 8 insert into T_PEEKING values (1003, 'C', 1003); 9 10 commit; 11 end; 12 / PL/SQL PRocedure sUCcessfully completed.
注重,我們給索引字段B插入的值中只有3個distinct值,記錄數是1003,它的集的勢很高(1003/3)=334。
SQL>SQL> analyze table T_PEEKING compute statistics for table for all indexes for all indexed columns; Table analyzed. SQL>
我們看下索引掃描的代價是多少:
SQL> show parameter OPTIMIZER_INDEX_COST_ADJ NAME TYPE VALUE------------------------------------ ----------- ------optimizer_index_cost_adj integer 100 SQL> delete from plan_table; 0 rows deleted. SQL> SQL> eXPlain plan for select /*+index(a T_PEEKING_IDX1)*/ * from T_PEEKING a where b = :V; Explained. SQL> select lpad(' ', 2*(level-1))Operation' 'options' ' 2 object_name' 'decode(id, 0, 'Cost='position) "Query 3 Plan_Table" 4 from plan_table 5 start with id = 0 6 connect by prior id = parent_id 7 ; QueryPlan_Table-----------------------------------------------------SELECT STATEMENT Cost=113 TABLE access BY INDEX ROWID T_PEEKING INDEX RANGE SCAN T_PEEKING_IDX1 SQL>
再看全表掃描的代價是多少:
SQL> delete from plan_table; 3 rows deleted. SQL>SQL> explain plan for select /*+full(a)*/ * from T_PEEKING a where b = :V; Explained. SQL>SQL> select lpad(' ', 2*(level-1))operation' 'options' ' 2 object_name' 'decode(id, 0, 'Cost='position) "Query 3 Plan_Table" 4 from plan_table 5 start with id = 0 6 connect by prior id = parent_id 7 ; QueryPlan_Table----------------------------------------------------SELECT STATEMENT Cost=75 TABLE ACCESS FULL T_PEEKING SQL>
這時,我們可以計算得出讓優化器使用索引(無提示強制)的OPTIMIZER_INDEX_COST_ADJ值應該< ROUND(COST_FTS/COST_IDX*100) = ROUND(75/113*100) = 66,而大于66則會使用全表掃描:
SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=67; System altered. SQL>SQL> delete from plan_table; 2 rows deleted. SQL>SQL> explain plan for select * from T_PEEKING a where b = :V; Explained. SQL>SQL> select lpad(' ', 2*(level-1))operation' 'options' ' 2 object_name' 'decode(id, 0, 'Cost='position) "Query 3 Plan_Table" 4 from plan_table 5 start with id = 0 6 connect by prior id = parent_id; QueryPlan_Table-----------------------------------------------------------------SELECT STATEMENT Cost=75 TABLE ACCESS FULL T_PEEKING SQL>SQL>SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=66; System altered. SQL>SQL> delete from plan_table; 2 rows deleted. SQL>SQL> explain plan for select * from T_PEEKING a where b = :V; Explained. SQL>SQL> select lpad(' ', 2*(level-1))operation' 'options' ' 2 object_name' 'decode(id, 0, 'Cost='position) "Query 3 Plan_Table" 4 from plan_table 5 start with id = 0 6 connect by prior id = parent_id; QueryPlan_Table---------------------------------------------------------SELECT STATEMENT Cost=75 TABLE ACCESS BY INDEX ROWID T_PEEKING INDEX RANGE SCAN T_PEEKING_IDX1
可以看出,在使用綁定變量時,參數OPTIMIZER_INDEX_COST_ADJ對于是否選擇索引會有重要的影響。這里我們暫且不討論索引掃描的原始成本是如何計算得出的。但是有一點很重要,在使用綁定變量時,計算出的成本是平均成本。在我們上面的例子中,字段B的值只有3個:"A"、"B"、"C",其中A最多,1003行中有1000行。因此,在索引上掃描值為A記錄的成本為1000/1003 * 索引全掃描成本 ≈索引全掃描成本,我們看下它的成本是多少:
SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=100; System altered. SQL>SQL> delete from plan_table; 2 rows deleted. SQL>SQL> explain plan for select /*+index(a T_PEEKING_IDX1)*/* from T_PEEKING a where b = 'A'; Explained. SQL>SQL> select lpad(' ', 2*(level-1))operation' 'options' ' 2 object_name' 'decode(id, 0, 'Cost='position) "Query 3 Plan_Table" 4 from plan_table 5 start with id = 0 6 connect by prior id = parent_id; QueryPlan_Table--------------------------------------------------------------SELECT STATEMENT Cost=336 TABLE ACCESS BY INDEX ROWID T_PEEKING INDEX RANGE SCAN T_PEEKING_IDX1
可以看到,它的成本是336。因此索引的平均成本是(336 * 1003/1000) / 3 ≈ 113,也就是使用綁定變量使的成本。而掃描其它兩個值"B"和"A"時代價就非常小。
SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=100; System altered. SQL>SQL> delete from plan_table; 3 rows deleted. SQL>SQL> explain plan for select /*+index(a T_PEEKING_IDX1)*/* from T_PEEKING a where b = 'B'; Explained. SQL>SQL> select lpad(' ', 2*(level-1))operation' 'options' ' 2 object_name' 'decode(id, 0, 'Cost='position) "Query 3 Plan_Table" 4 from plan_table 5 start with id = 0 6 connect by prior id = parent_id; QueryPlan_Table---------------------------------------------------------------SELECT STATEMENT Cost=2 TABLE ACCESS BY INDEX ROWID T_PEEKING INDEX RANGE SCAN T_PEEKING_IDX1
因為計算的成本是平均成本(相對實際掃描某個值的成本,平均成本更接近全表掃描成本),因此在創建查詢計劃時,使用綁定變量將更加輕易受到參數OPTIMIZER_INDEX_COST_ADJ影響,非凡是上面的這種情況(即索引字段的集的勢非常高時)下,平均代價與實際掃描某個值代價相差非常遠。這種情況下,OPTIMIZER_INDEX_COST_ADJ對不使用綁定變量查詢影響就非常小(因為索引代價不是比全表掃描成本大很多就是小很多),不管掃描哪個值,不使用綁定變量將更加輕易選擇到合理的查詢計劃。 綁定變量窺視 在了解了參數OPTIMIZER_INDEX_COST_ADJ的作用后。再了解一個對查詢計劃,非凡是使用綁定變量時會產生重大影響的特性:綁定變量窺視(Bind Variables Peeking)。 綁定變量窺視是9i以后的一個新特性。它使CBO優化器在計算訪問代價時,將綁定變量傳入的值考慮進去,從而計算出更合理的成本(否則,將會計算平均成本)??聪旅胬樱?
SQL> conn sys/sys as sysdbaConnected.SQL>SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=60; System altered. SQL> analyze table T_PEEKING compute statistics for table for all indexes for all indexed columns; Table analyzed. SQL>SQL> set autot traceSQL>SQL> alter session set sql_trace = true; Session altered. SQL>SQL> var v char(1)SQL>SQL> exec :v := 'A'; PL/SQL procedure successfully completed. SQL>SQL> select * from T_PEEKING a where b = :V; 1000 rows selected. SQL>SQL> alter session set sql_trace = false; Session altered.
用Tkprof處理生成的trace文件。因為在存在綁定變量窺視時,autotrace或者explain plan可能不會顯示正確的查詢計劃,需要Tkprof來處理sql trace。
tkprof fuyuncat_ora_5352.trc aaa.txt
此時OPTIMIZER_INDEX_COST_ADJ是60,根據上面的結論,似乎查詢計劃應該選擇掃描索引。但是,這里給綁定變量賦了值"A",這時,優化器會“窺視”到這個值,并且在計算掃描成本時按照這個值的成本來計算。因此,得出的查詢計劃是全表掃描,而不是掃描索引,靠Tkprof分析的結果:
select * from T_PEEKING a where b = :V call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------Parse 1 0.00 0.00 0 0 0 0Execute 1 0.00 0.00 0 0 0 0Fetch 68 0.01 0.07 0 406 0 1000------- ------ -------- ---------- ---------- ---------- ---------- ----------total 70 0.01 0.08 0 406 0 1000 Misses in library cache during parse: 1Optimizer mode: CHOOSEParsing user id: SYS Rows Row Source Operation------- --------------------------------------------------- 1000 TABLE ACCESS FULL T_PEEKING (cr=406 pr=0 pw=0 time=5052 us)
但是,綁定變量窺視對一條語句只會使用一次。就是說,在第一次解析語句時,將綁定變量值考慮進去計算成本生成查詢計劃。以后在執行該語句時都采用這個查詢計劃,而不再考慮以后綁定變量的值是什么了。
SQL> conn sys/sys as sysdbaConnected.SQL>SQL>SQL> set autot traceSQL>SQL> alter session set sql_trace = true; Session altered. SQL>SQL> var v char(1)SQL>SQL> exec :v := 'B'; PL/SQL procedure successfully completed. SQL>SQL> select * from T_PEEKING a where b = :V; 1000 rows selected. SQL>SQL> alter session set sql_trace = false; Session altered.
再用Tkprof分析生成的trace文件,看到盡管這里的值是"B",選擇索引掃描會更優,但分析結果中查詢計劃還是使用全表掃描:
select * from T_PEEKING a where b = :V call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------Parse 1 0.00 0.00 0 0 0 0Execute 1 0.00 0.00 0 0 0 0Fetch 2 0.00 0.00 0 340 0 2------- ------ -------- ---------- ---------- ---------- ---------- ----------total 4 0.00 0.00 0 340 0 2 Misses in library cache during parse: 0Optimizer mode: CHOOSEParsing user id: SYS Rows Row Source Operation------- --------------------------------------------------- 2 TABLE ACCESS FULL T_PEEKING (cr=340 pr=0 pw=0 time=1005 us)
因此,這種情況下使用綁定變量也會導致無法選擇最優的查詢計劃。 綜上所述,我們可以得出一個結論:在對建有索引的字段(包括字段集),且字段(集)的集的勢非常大時,使用綁定變量可能會導致查詢計劃錯誤,因而會使查詢效率非常低。


上一篇:在Linux系統下優化Oracle具體步驟

下一篇:Oracle 10g數據庫的安全性和身份管理

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品影院在线观看| 91伊人影院在线播放| 亚洲国产精品美女| 欧洲美女免费图片一区| 狠狠久久五月精品中文字幕| 欧美激情按摩在线| 欧美精品激情blacked18| 亚洲国内精品在线| 欧美福利在线观看| zzijzzij亚洲日本成熟少妇| 超在线视频97| 亚洲精品一区二三区不卡| 亚洲在线免费视频| 日韩av最新在线| 日韩av电影院| 欧美最顶级丰满的aⅴ艳星| 乱亲女秽乱长久久久| 欧美在线一级va免费观看| 国产专区欧美专区| 成人福利免费观看| 国产精品久久久久91| 91在线直播亚洲| 成人黄色av网站| 国产欧美日韩中文字幕| 日本精品视频在线| 91欧美精品午夜性色福利在线| 亚洲精品一区中文字幕乱码| 国产精品第100页| 精品国产1区2区| 精品中文字幕久久久久久| 欧美性色19p| 日韩人体视频一二区| 日韩欧美在线视频| 久久久久久久久国产精品| 亚洲成人久久久久| 欧美成人午夜免费视在线看片| 日韩中文字在线| 日韩精品视频在线播放| 日韩经典中文字幕| 亚洲欧美国产精品专区久久| 日韩精品在线视频| 国产一区深夜福利| 国产精品视频不卡| 日韩欧美在线免费| 亚洲精品永久免费| 日韩美女视频在线观看| 日韩电影中文字幕在线| 日韩av综合网| 菠萝蜜影院一区二区免费| 欧美黄色片视频| 最近的2019中文字幕免费一页| 久久综合伊人77777| 成人精品久久av网站| 久久精品男人天堂| 欧美国产日韩一区二区在线观看| 亚洲日韩欧美视频| 国产精品aaa| 日韩一区二区在线视频| 国产精品亚洲自拍| 欧美肥老太性生活视频| 亚洲成人激情在线观看| 久久视频在线免费观看| 欧美精品18videos性欧| 亚洲精品按摩视频| 国产精品久久久久久久7电影| 亚洲已满18点击进入在线看片| 黑人巨大精品欧美一区二区| 欧美午夜片在线免费观看| 欧美日韩国产精品专区| 国产精品第七十二页| 日韩av电影院| 国内精品小视频| 欧美日韩一区二区在线| 欧美猛少妇色xxxxx| 亚洲综合成人婷婷小说| 久久天天躁狠狠躁夜夜躁2014| 欧美野外猛男的大粗鳮| 91免费高清视频| 国产日产欧美a一级在线| 欧美限制级电影在线观看| 国产精品精品久久久久久| 超碰精品一区二区三区乱码| 韩国精品久久久999| 亚洲小视频在线| 国产成人在线一区| 国产日韩欧美在线播放| 午夜欧美不卡精品aaaaa| 久久久久久欧美| 国产精品九九九| 2019中文字幕在线免费观看| 国产欧洲精品视频| 国产香蕉一区二区三区在线视频| 国产免费久久av| 日韩av在线一区| 日韩成人小视频| 96精品视频在线| www.国产一区| 日韩激情视频在线播放| 欧美激情18p| 日韩精品电影网| 国产精品99久久久久久久久| 久久精品国产综合| 国产精品国内视频| 2019日本中文字幕| 91po在线观看91精品国产性色| 日韩精品视频在线免费观看| 午夜精品久久久久久久99热浪潮| 久久精品国产亚洲精品2020| 在线日韩精品视频| 午夜精品理论片| 亚洲第五色综合网| 国产成人aa精品一区在线播放| 国产成+人+综合+亚洲欧洲| 国产69精品久久久久久| 久久久久久999| 视频在线观看一区二区| 91在线免费观看网站| 免费成人高清视频| 7777免费精品视频| 精品视频在线播放免| 日韩视频免费在线观看| 亚洲精品二三区| 久久久久久国产精品三级玉女聊斋| 在线观看免费高清视频97| 日本国产精品视频| 中文字幕精品—区二区| 中文字幕欧美日韩在线| 欧美国产高跟鞋裸体秀xxxhd| 亚洲欧美中文日韩在线| 久久手机精品视频| 日韩av免费看网站| 欧美国产乱视频| 亚洲老司机av| 欧美高清无遮挡| 亚洲有声小说3d| 日韩欧美在线视频观看| 国产精品专区一| 国产成人av网| 国产成人在线一区二区| 久久精品在线视频| 欧美电影免费在线观看| 欧美成人午夜激情视频| 国产成人精品久久亚洲高清不卡| 538国产精品视频一区二区| 北条麻妃99精品青青久久| 国产精品高潮呻吟久久av黑人| 国产精品xxxxx| 日韩日本欧美亚洲| 久久久亚洲成人| 亚洲日本欧美中文幕| 亚洲国产精品嫩草影院久久| 国产精品久久久久久久久借妻| 久久精品国产久精国产一老狼| 国产精品欧美在线| 欧美理论在线观看| 欧美国产日韩在线| 精品动漫一区二区三区| 久久高清视频免费| 日韩中文字幕在线视频| 国产精品一区二区久久| 久久91精品国产91久久久| 午夜精品久久久久久久久久久久| 57pao国产精品一区| 中文字幕欧美日韩|