SQl語句中使用占位符的優點
1.增加SQL代碼可讀性
2.占位符可以預先編譯,提高執行效率
3.防止SQL註入
4用占位符的目的是綁定變量,這樣可以減少數據SQL的硬解析,所以執行效率會提高不少
綁定變量是Oracle解決硬解析的首要利器,能解決OLTP系統中library cache的過度耗用以提高性能
綁定變量是Oracle解決硬解析的首要利器,能解決OLTP系統中library cache的過度耗用以提高性能。然刀子磨的太快,使起來鋒利,卻容易折斷。凡事皆有利弊二性,因地制宜,因時制宜,全在如何權衡而已。本文講述了綁定變量的使用方法,以及綁定變量的優缺點、使用場合。
提到綁定變量,就不得不了解硬解析與軟解析。硬解析簡言之即一條SQL語句沒有被運行過,處於首次運行,則需要對其進行語法分析,語義識別,跟據統計信息生成最佳的執行計劃,然後對其執行。而軟解析呢,則是由於在library cache已經存在與該SQL語句一致的SQL語句文本、運行環境,即有相同的父遊標與子遊標,采用拿來主義,直接執行即可。軟解析同樣經歷語法分析,語義識別,且生成hash value ,接下來在library cache搜索相同的hash value ,如存在在實施軟解析。有關更多的硬解析與軟解析以及父遊標,子遊標
綁定變量是為了減少解析的,比如你有個語句這樣:
select aaa,bbb from ccc where ddd=eee;
如果經常通過改變eee這個謂詞賦值來查詢,像如下
select aaa,bbb from ccc where ddd=fff;
select aaa,bbb from ccc where ddd=ggg;
select aaa,bbb from ccc where ddd=hhh;
每條語句都要被數據庫解析一次,這樣比較浪費資源,如果把eee換成“:1”這樣的綁定變量形式,無論ddd後面是什麽值,都不需要重復解析
假設要將id從1到10000的員工的工資都更新為150.00元,
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3");
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4");
....
sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000");
使用綁定變量:
UPDATE employees SET salay = ? WHERE id = ?"
二者區別在於,不用綁定變量,則相當於反復解析、執行了1w個sql語句。使用綁定變量,解析sql語句只用了一次,之後的9999次復用第一次生成的執行計劃。顯然,後者效率會更高一些。
什麽時候不應該/不必要使用綁定變量
•a. 如果你用數據倉庫,一條大查詢一跑幾個小時,根本沒必要做綁定變量,因為解析的消耗微乎其微。
•b. 變量對優化器產生執行計劃有很重要的影響的時候:綁定變量被使用時,查詢優化器會忽略其具體值,因此其預估的準確性遠不如使用字面量值真實,尤其是在表存在數據傾斜(表上的數據非均勻分布)的列上會提供錯誤的執行計劃,從而使得非高效的執行計劃被使用。
SQl語句中使用占位符的優點