C#中SqlParameter的性能

时间:2013-04-05 01:45:06

标签: asp.net sql-server

我有一个这样的存储过程:

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'";

现在我的问题是它与性能有什么关系来指定参数的数据类型或长度?

哪一个表现最好?我可以依赖微软网站上的任何文件吗?

或者是否有任何安全原因来指定参数的数据类型和长度?

2 个答案:

答案 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对我来说似乎有点可疑,我不知道也无法确定或者不这样做会产生(负面的)性能影响;我绝对不会这样开始(不清楚,你做的不那么明显,你没有使用参数传递你的价值 - 只是凌乱!)