引數化查詢比拼接字串慢的原因

2022-02-06 21:23:32 字數 1144 閱讀 8498

我們都知道,引數化查詢可以處理sql注入,以及提高查詢的效率,因為引數化查詢會使mssql快取查詢的計畫.

但是現在我發現乙個奇怪的問題,就是引數化查詢比字串拼接要慢,而且速度相差10倍之多.

sql語句是:

select

*from t_message where t_message.belongto=

@belongto

開始在ado.net中用sqlparameter傳遞引數@belongto時是這麼寫的

sqlparameter param1 = new sqlparameter("

@belongto

","20782c1090fe47e2838b125cb25c1d39

");

結果發現上面這段**在ado.net中執行查詢,比在查詢分析中直接執行下面的sql慢10倍之多。。。

select

*from t_message where t_message.belongto=

'20782c1090fe47e2838b125cb25c1d39

'

結果將sqlparameter改為下面這樣,增加引數sqldbtype的宣告後,ado.net的查詢就變得和在查詢分析器中執行一樣快了

sqlparameter param1 = new sqlparameter("@belongto", sqldbtype.char,32

);param1.value

= "20782c1090fe47e2838b125cb25c1d39";

原因:

經過查閱資料和自己的分析後,得知原來是字元型別的不匹配造成的。因為這個資料表是客戶資料庫中的,我只是提取資料,而我一般建資料表都使用nvarchar型別,而客戶的這個表使用的是char(32),在查詢分析器中直接寫字串作為查詢條件時,查詢優化器認為條件中等號兩邊的字元型別是相同的,從而會選擇聚集索引查詢,而在ado.net中使用sqlparameter後,因為字段型別錯誤導致了sql查詢從索引掃瞄變成了表掃瞄... 所以為了避免在sql查詢中由於條件字段型別不匹配而導致表掃瞄,記得以後在建立sqlparameter時宣告sqldbtype就解決問題了。

C 中引數化查詢速度慢的原因

今天同事問了乙個很有意思的問題,為啥我執行的sql在資料庫裡面執行的很快,在程式中執行的速度怎麼能這麼慢?真實案例 只是查詢語句不是這麼簡單 同事 你看我執行的語句在sqlserver中執行的有多快 語句 select a.id,b.id,a.其他列 from a left join b on a....

字串格式化大比拼

在平常的程式設計過程中,總免不了格式化字串。而作為c 程式設計師,是快樂的也是痛苦不的。快樂是因為我們有多種方式來達到目的,痛苦也是因為有多種方式而難以決策,總是在思索效率與優雅!c 逐步 淪落 的原因也正是因為她的高貴的氣質 難以駕馭 時尚的髮型 模板 狂野的性格 記憶體 哎,迷戀它,她就是我的傳...

python 字串拼接 格式化

1.字串的拼接 例 a hello b python c 將a,b c 中的字串連成一句話。第一種方法 用 號 a b c 第二種方法 格式化字串 s s s s a b c 注 s前面可以加物件名,後面以字典的方式填入 第三種方法 join 方式,注意括號裡是要連線的可以是列表,元祖 join a...