包含繫結變數的sql進行調優需注意一點

2022-07-26 23:12:20 字數 2012 閱讀 4939

拿1個sql舉個例子,我只貼出了where後面部分

實際環境中有init_date 和direct_no的組合索引idx_date_no

上訴標紅處,:b3=0 和:b3<>0這兩種情況oracle在選擇執行計畫的時候會有很大的區別。

如果是:b3<>0,則oracle會在index_range_scan idx_date_no 時一次過濾出同時符合 init_date和direct_no列的資料。執行效果如下:

如果是:b3=0,則oracle會在index_range_scan idx_date_no 時只濾出符合 init_date列的資料。執行效果如下:

帶有繫結變數的sql,oracle在選擇執行計畫的時候會相對保守,按照無法獲知:b3輸入值為前提條件,選擇更為穩妥的只過濾init_date列的執行計畫。在調優的過程中如果我們直接替換繫結變數成具體代入值,看到的執行計畫只是霧裡看花,花非花,霧非霧。不能表示最終的調優結果!

所以在對帶有繫結變數的sql調優時,要嚴格按照定義繫結變數、賦值、執行的原則獲取調優過程中的執行計畫。

附上繫結變數值查詢指令碼,實際使用替換下sql_id。

select * from (select

case cc.datatype_string when '

number

' then '

var

' || substr((name),2) || '

' || datatype_string || ';'

else

'var

' || substr((name),2) || '

' || datatype_string || '

;' end as

sqlbindss

from (select *

from

dba_hist_sqlbind a

where sql_id = 'gxbw9up2pw0fx'

order by last_captured) cc

where rownum <= (select count(*)

from

dba_hist_sql_bind_metadata a

where sql_id = 'gxbw9up2pw0fx'

)union

select

case cc.datatype_string when '

number

' then '

exec

'||name||'

:= '|| value_string || ';'

else

'exec

'||name||'

:= '''|| value_string || '''

;' end as

sqlbindss

from (select *

from

dba_hist_sqlbind a

where sql_id = 'gxbw9up2pw0fx'

order by last_captured) cc

where rownum <= (select count(*)

from

dba_hist_sql_bind_metadata a

where sql_id = 'gxbw9up2pw0fx')) order by 1 desc;

SQL調優之繫結變數用法簡介

介紹繫結變數之前,先介紹sql執行過程和硬解析的概念 執行sql的過程,會將sql的文字進行hash運算,得到物件的hash值,然後拿hash值,去hash buckets裡遍歷快取物件控制代碼鍊錶,找到對應的快取物件控制代碼,然後就可以得到快取物件控制代碼裡對應sql執行計畫 解析樹等物件,所以執...

SQL調優之繫結變數用法簡介

介紹繫結變數之前,先介紹sql執行過程和硬解析的概念 執行sql的過程,會將sql的文字進行hash運算,得到物件的hash值,然後拿hash值,去hash buckets裡遍歷快取物件控制代碼鍊錶,找到對應的快取物件控制代碼,然後就可以得到快取物件控制代碼裡對應sql執行計畫 解析樹等物件,所以執...

SQL調優之繫結變數用法簡介

介紹繫結變數之前,先介紹sql執行過程和硬解析的概念 執行sql的過程,會將sql的文字進行hash運算,得到物件的hash值,然後拿hash值,去hash buckets裡遍歷快取物件控制代碼鍊錶,找到對應的快取物件控制代碼,然後就可以得到快取物件控制代碼裡對應sql執行計畫 解析樹等物件,所以執...