拿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 (selectcase 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執行計畫 解析樹等物件,所以執...