我有一个这样的存储过程:
create proc wsp_test
(
@age int
, @userName varchar(30)
)
as
select userID, userName
from Users
where userName like '%' + @userName + '%'
and age > @age
这是C#代码:
案例1:
SqlCommand _cmd = new SqlCommand();
_cmd.Parameters.Add("age", SqlDbType.Int, 4);
_cmd.Parameters.Add("UserName", SqlDbType.VarChar, 30);
案例2:
SqlCommand _cmd = new SqlCommand();
_cmd.Parameters.Add("age", SqlDbType.Int);
_cmd.Parameters.Add("UserName", SqlDbType.VarChar);
案例3:
SqlCommand _cmd = new SqlCommand();
_cmd.Parameters.Add("age");
_cmd.Parameters.Add("UserName");
案例4:
SqlCommand _cmd = new SqlCommand();
_cmd.CommandText = "EXEC wsp_test 20, 'John'";
现在我的问题是它与性能有什么关系来指定参数的数据类型或长度?
哪一个表现最好?我可以依赖微软网站上的任何文件吗?
或者是否有任何安全原因来指定参数的数据类型和长度?
答案 0 :(得分:1)
与此相比,数据类型的性能完全无关:
where userName like '%' + @userName + '%'
查询的这一特定部分将比处理参数花费指数多的时间。
我建议在此阶段不要关心表现。太早了。当然不是指定参数类型和长度的微观基准。看看其他因素。是的,您应该指定类型,它使代码更易于维护,并且可以使运行时转换问题更容易识别和解决。
如果您稍后确定此特定代码是您的应用程序的瓶颈,那么请查看使用用户名字段的全文。您还可以查看此代码用法的统计信息,并确定您是否真的需要它。大多数查询是否与用户名完全匹配或至少以?开头?您的用例首先搜索完全匹配是否有用,这显然更快,并且只搜索没有完全匹配的部分匹配?
答案 1 :(得分:0)
为清楚起见,为了清楚而无误地传达您的意图,我会使用
案例5 :
SqlCommand _cmd = new SqlCommand();
_cmd.Parameters.Add("age", SqlDbType.Int);
_cmd.Parameters.Add("UserName", SqlDbType.VarChar, 30);
对于SqlDbType.Int
,指定大小没有必要也没有意义 - 始终 4个字节且无法更改,无法调整。
对于SqlDbType.VarChar
,我会始终指定长度,只是为了清楚你想要在这个参数中拥有什么。这可能不是绝对必要的 - 但我喜欢对这些事情非常明确。
从表现的角度来看,我认为案例1-3将是等同的(给予或接受),而案例#4对我来说似乎有点可疑,我不知道也无法确定或者不这样做会产生(负面的)性能影响;我绝对不会这样开始(不清楚,你做的不那么明显,你没有使用参数传递你的价值 - 只是凌乱!)