0

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

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

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

哪一个的性能最好?是否有任何来自 Microsoft 网站的文档可供我依赖?

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

4

2 回答 2

1

与此相比,数据类型的性能完全无关紧要:

where     userName  like '%' + @userName + '%'

查询的这个特定部分将比处理参数花费更多的时间。

我建议在这个阶段不要关心性能。太早了。当然不是微基准是否指定参数的类型和长度。看看其他因素。是的,您应该指定类型,它使代码更易于维护,并且可以使运行时转换问题更容易识别和解决。

如果您稍后确定此特定代码是您的应用程序的瓶颈,请考虑对用户名字段使用全文。您还可以查看此代码使用情况的统计信息,并确定您是否真的需要它。大多数查询是否与用户名完全匹配或至少以开头匹配?对于您的用例来说,首先搜索完全匹配是否会更好,这会明显更快,并且只搜索未找到完全匹配的部分匹配?

于 2013-04-05T02:07:00.440 回答
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 对我来说似乎有点可疑,我不知道也不能真正判断是否做这种方式会对性能产生(负面)影响;我一开始就永远不会这样做(目前还不清楚,你在做什么并不那么明显,你没有使用参数来传递你的值 - 只是混乱!)

于 2013-04-05T05:08:23.707 回答