如何執行綁定變量的SQL
1. 認識綁定變量:
綁定變量是為了減少解析的,比如你有個語句這樣
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後麵是什麼值,都不需要重複解析
Java實現綁定變量的方法:
[java] view plain copy
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 15.00);
pstmt.setInt(2, 110592);
/result statmement: UPDATE employees SET salay = 15.00 WHERE id = 110592
pstmt.executeQuery();
假設要將id從1到10000的員工的工資都更新為150.00元,不使用綁定變量,則:[java] view plain copy 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"); 使用綁定變量,則:
[java] view plain copy PreparedStatement pstmt; for (id = 1; id < 10000;="" id++)="" {="" if="" (null="=" pstmt)="" pstmt="con.prepareStatement("UPDATE" employees="" set="" salay="?" where="" id="?");" pstmt.setbigdecimal(1,="" 150.00);="" pstmt.setint(2,="" id);="" pstmt.executequery();="" }="">
2. 什麼時候不應該/不必要使用綁定變量
a. 如果你用數據倉庫,一條大查詢一跑幾個小時,根本沒必要做綁定變量,因為解析的消耗微乎其微。b. 變量對優化器產生執行計劃有很重要的影響的時候:綁定變量被使用時,查詢優化器會忽略其具體值,因此其預估的準確性遠不如使用字麵量值真實,尤其是在表存在數據傾斜(表上的數據非均勻分布)的列上會提供錯誤的執行計劃。從而使得非高效的執行計劃被使用。
3. 綁定變量在OceanBase中的實現
目前OceanBase中實現了綁定變量,目的主要是為了編程方便,而不是為了降低生成執行計劃的代價。為什麼呢?因為OceanBase中目前使用的是一種”靜態執行計劃“,無論什麼Query,執行流程都一樣。OB在前端代理ObConnector中實現綁定變量,將用戶傳入的變量進行to_string()操作,替代SQL語句中相應的部分,形成一個完整的SQL。然後這個SQL傳遞給MS,MS按照標準流程來解析和執行。相信不遠的將來,OB將會實現真正意義上的綁定變量,讓用戶享受到綁定變量帶來的好處。
C#net 怎麼使oracle sql 語句綁定變量
數據集特別死,控製力很差。並且效率很低
如果不是做係統級別的不推薦
你sql server怎麼玩 這裏的 oracle的 語句就怎麼寫 沒什麼關係,隻是一個連接字符串和 環境的問題 可以參考一下,下麵的代碼:
OracleConnection oraCon = new OracleConnection("data source=test;user id=test;password=test");
OracleCommand oraCmd = new OracleCommand("select * from tb where id=:id", oraCon);
OracleParameter oraPara = new OracleParameter("id", OracleType.NVarChar);
oraPara.Direction = ParameterDirection.Input;
oraPara.Value = "001";
oraCmd.Parameters.Add(oraPara);
oraCon.Open();
OracleDataReader oraRdr = oraCmd.ExecuteReader(CommandBehavior.CloseConnection);
oraRdr.Read();
Response.Write(oraRdr[0].ToString());
oraRdr.Close();
如何找出未使用綁定變量的SQL
可以看到insert into test.......這條語句竟然在shared pool裏麵解析了1000次,通過如下查詢
select sql_text from v$sqlarea where sql_text like 'insert into test %';找出具體的sql代碼,然後與開發人員商量,更改SQL代碼。
上麵隻是一個簡單的實例,具體要怎麼查看你的應用是否使用了綁定變量,隻需要簡單修改
select substr(sql_text,1,20), count(*)
from v$sqlarea
group by substr(sql_text,1,20) having count(*) > 50;
可以將substr(sql_text,1,20) 改為substr(sql_text,1,30)等等,可以 having count(*) > 10,20,100等等。
如何查看Oracle SQL綁定變量
查看Oracle SQL綁定變量方法如下:
alter session set nls_date_format = 'yyyy-mm-dd,hh24:mi:ss';
set linesize 400
col sql_Id format a20
col name format a20
col datatype_string format a14
col value_string format a20
--這個sql從內存中讀取綁定變量值信息,若是不在內存中,則使用下一個sql
select sql_id,name, datatype_string, last_captured,value_string from v$sql_bind_capture where sql_id='dxfcacn4t4ppw' order by LAST_CAPTURED,POSITION;
--這個sql從awr中讀取綁定變量值信息
select instance_number, sql_id,name, datatype_string, last_captured,value_string from dba_hist_sqlbind where sql_id='fahv8x6ngrb50'order by LAST_CAPTURED,POSITION;
sql語句like匹配,怎麼使用綁定變量
應用程序進行升級,出現該條語句每次都硬解析
select tabxncompa0_.COMPANY_ID as x0_0_ from TAB_XN_COMPANY tabxncompa0_ where (tabxncompa0_.COMPANY_MOBILE like '%13509563578' )and((tabxncompa0_.COMPANY_STATUS<3 )or(tabxncompa0_.company_status="">3 ))
怎樣察看沒有使用綁定變量的sql語句
FORCE_MATCHING_SIGNATURE的值相同,而EXACT_MATCHING_SIGNATURE值不同,說明在cursor_sharing=force時,執行計劃可共用;
cursor_sharing=exact時,執行計劃不可共用;
實際上我們使用綁定變量後,同樣也可以達到執行計劃共用的效果。
mysql的SQL語句有像oracle那樣可以綁定變量嗎
有的
如何用動態SQL語句給變量賦值
在一個問題中遇到的一段精典動態SQL代碼:declare @fdate datetimedeclare @sql0 nvarchar(4000)declare @banzhi varchar(4),@num varchar(4),@cur_id intset @cur_id=2497set @sql0=' SELECT @banzhi=b'+case when substring(convert(char(10),@fdate,120),9,1)=0 then substring(convert(char(10),@fdate,120),10,1)else substring(convert(char(10),@fdate,120),9,2)end+' FROM kq_paiban'+' where empid='''+rtrim(convert(char,@cur_id))+''' andsessionid=(select id from s_session where convert(varchar(7),date0,120)='''+substring(convert(char(10),@fdate,120),1,7)+''')'select (@sql0)--顯示動態構造的SQL語句--在構造動態SQL語句字符串時,對其中動態部分(比如這裏的列名B1,B2[Bi]後麵變化的部分i)要先運算出來,還有其中的常量部分,最後將字符串連接成完整語句.exec sp_executesql @sql0,N'@banzhi varchar(4) output',@num output--這裏沒有使用EXEC()函數,因為該存儲過程支持嵌入參數.
預編譯sql語句就sql綁定變量嗎
1. 認識綁定變量:
綁定變量是為了減少解析的,比如你有個語句這樣
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後麵是什麼值,都不需要重複解析
Java實現綁定變量的方法:
[java] view plaincopy
PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 15.00);
pstmt.setInt(2, 110592);
/result statmement: UPDATE employees SET salay = 15.00 WHERE id = 110592
pstmt.executeQuery();
假設要將id從1到10000的員工的工資都更新為150.00元,不使用綁定變量,則:
[java] view plaincopy
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");
使用綁定變量,則:
[java] view plaincopy
PreparedStatement pstmt;
for (id = 1; id < 10000;="" id="">
{
if (null == pstmt)
pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");
pstmt.setBigDecimal(1, 150.00);
pstmt.setInt(2, id);
pstmt.executeQuery();
}
二者區別在於,不用綁定變量,則相當於反複解析、執行了1w個sql語句。使用綁定變量,解析sql語句隻用了一次,之後的9999次複用第一次生成的執行計劃。顯然,後者效率會更高一些。
2. 什麼時候不應該/不必要使用綁定變量
a. 如果你用數據倉庫,一條大查詢一跑幾個小時,根本沒必要做綁定變量,因為解析的消耗微乎其微。
b. 變量對優化器產生執行計劃有很重要的影響的時候:綁定變量被使用時,查詢優化器會忽略其具體值,因此其預估的準確性遠不如使用字麵量值真實,尤其是在表存在數據傾斜(表上的數據非均勻分布)的列上會提供錯誤的執行計劃。從而使得非高效的執行計劃被使用。
3. 綁定變量在OceanBase中的實現
目
前OceanBase中實現了綁定變量,目的主要是為了編程方便,而不是為了降低生成執行計劃的代價。為什麼呢?因為OceanBase中目前使用的是一
種”靜態執行計劃“,無論什麼Query,執行流程都一樣。OB在前端代理ObConnector中實現綁定變量,將用戶傳入的變量進行
to_string()操作,替代SQL語句中相應的部分,形成一個完整的SQL。然後這個SQL傳遞給MS,MS按照標準流程來解析和執行。相信不遠的
將來,OB將會實現真正意義上的綁定變量,讓用戶享受到綁定變量帶來的好處。
SQL參數異常或者SQL語句語法錯誤,並非所有變量都已綁定 執行錯誤
裏麵有二個變量
ai.rec_staus= ?
TO_DATE(?,
你調用時,要將實際值傳進去,才行。
轉載請注明出處句子大全網 » 如何執行綁定變量的SQL
3>