今天同事問了一個很有意思的問題,為啥我執行的Sql在數據庫里面執行的很快,在程序中運行的速度怎么能這么慢?
真實案例(只是查詢語句不是這么簡單):
同事:你看我執行的語句在SQLserver中執行的有多快
語句:select a.id,b.id,a.其他列 from a left join b on a.bid=b.id where a.name='huage'
我說:你別光看語句啊,之前sql語句拼接字符串才是這樣的執行語句啊。你看語句監視看看,到底執行的是什么語句
同事:exec sp_executesql N'select a.id,b.id,a.其他列 from a left join b on a.bid=b.id where a.name=@name',N'@name nvarchar(5)',@name=N'huage' 語句是這個啊,參數化執行跟我之前的拼接sql沒區別啊?
我說:你把這個放到查詢里面看看,執行起來咋樣?
同事:復制粘貼,哎呀媽呀,真nm的慢?咋回事啊?
我說:你把那個參數的類型改成varchar看看
同事:哎呦我去,就去掉了個n,這速度能提這么快?
我說:這邊查詢最好根據數據庫字段的聲明類型來設置類型,根據實際的字符大小來設置大小,這樣才不會出現‘卡頓’的Sql
總結方法
參數化查詢的時候,我們可以使用
new SqlParameter("@name", "1212華哥")
{
SqlDbType = SqlDbType.VarChar,
Size=System.Text.Encoding.Default.GetByteCount("1212華哥")
};
因為數據庫中的中文是兩個字節,英文是一個字節,所以這邊參數的大小我們最好使用取參數的字節數
心得體會
善於發現一些問題,這樣才能使自己提高,不能為了會用而自得,要為得心應手找方法。
萬丈高樓平地起,也要靠積累