參考:http://f.dataguru.cn/thread-208881-1-1.html
參考:http://blog.sina.com.cn/s/blog_4d9ece9a0100caw8.html
注:加粗皆為參考引用
不廢話,直接說:
因為oracle對於sql語句的首先的解析邏輯,會先匹配是否可以軟解析,不行則會進行硬解析,相對而言 硬解析比較麻煩。
select * from table where id = '1' 和 select * from table where id = '2' 會被當做不同的兩條語句 執行硬解析。
如果此類sql 比較多,則大量的硬解析會造成latch的爭用和訪問阻塞等
而假如使用綁定變量
variable cnt number;
exec :cnt:=1;
select * from table where id=:cnt;
exec :cnt:=2;
select * from table where id=:cnt;
則認為是相同語義的語句,不會執行多次硬解析。
以上為好處。
當然也有需要注意的壞處:
如果使用綁定變量,那么優化器就會忽略直方圖的信息,在生成執行計划的時候可能不夠優化。
先說直方圖,它是優化器使用的一種統計數據,里面可以看出記錄的分布情況,比如1-100有多少條,101-200有多少條記錄,等等。
當id為索引時, 使用綁定變量會出現一個BUG。假設table中有10萬條記錄是id=1,10條記錄是id=2,
variable cnt number;
exec :cnt:=1;
select * from table where id=:cnt; 不走索引
exec :cnt:=2;
select * from table where id=:cnt; 因為第一次執行 id = 1 ,第二次解析執行時,使用第一次的結果,不走索引
結論:
除非訪問的索引字段傾斜性很嚴重,類似上面的例子,需要使用直方圖的,其他情況,都可以使用綁定變量。如果需要使用直方圖,建議還是別用綁定變量了。
