今天同事问了一个很有意思的问题,为啥我执行的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华哥")
};
因为数据库中的中文是两个字节,英文是一个字节,所以这边参数的大小我们最好使用取参数的字节数
心得体会
善于发现一些问题,这样才能使自己提高,不能为了会用而自得,要为得心应手找方法。
万丈高楼平地起,也要靠积累