什么是更快:SqlCommand.Parameters [string]或.Parameters [int]?

时间:2009-03-14 01:05:59

标签: c# .net sql performance ado.net

首选哪种方式?

SqlCommand = new SqlCommand(query);

command.Parameters.Add("@Foo");
command.Parameters[0].Value = Foo;
command.Parameters.Add("@Bar");
command.Parameters[1].Value = Bar;

// or

command.Parameters.Add("@Foo");
command.Parameters.Add("@Bar");
command.Parameters["@Foo"].Value = Foo;
command.Parameters["@Bar"].Value = Bar;

4 个答案:

答案 0 :(得分:13)

另外两个选择:

command.Parameters.AddWithValue("@Foo", Foo);

command.Parameters.Add("@Foo").Value = Foo;

此外,我不认为它们之间的速度差异足以让你根据它选择;选择一个对您和您的团队最具可读性的那个。

答案 1 :(得分:9)

严格地说,使用int重载更快。原因是底层集合存储为数组并使用整数偏移量。当你调用字符串重载时,它会将参数转换为int,然后基本上调用int重载。

真正的问题是“它是否重要”?除非你有可能有数千个参数,否则这不太可能。即便如此,在分析器说它之前,你无法确认这是一个问题。

答案 2 :(得分:4)

您无需创建参数,然后添加它们,然后填写它们。这将很快变得完全笨拙。

“最佳做法”方法是使用AddWithValue

command.Parameters.AddWithValue("@ParamName", Value);

就“速度”而言,这是过早优化的经典案例。当您的整体设计仍然需要这么多工作时,您根本不需要专注于如此小的速度差异。

答案 3 :(得分:1)

无论速度如何,使用带编号的参数的问题是,如果底层存储过程的参数顺序发生更改,则您的代码将需要重新编译。

想象一下,proc是从两个不同的代码片段中使用的,但是你并不知道在参数列表中间添加一个带有默认值的新参数的第二种用法。由于您使用的是编号参数,因此您只是处于广告中。

问题不在于哪个更快。问题是哪个更稳健,因为速度差异可能相对较小,除非你非常难以击中存储过程。这可能意味着您需要提出一些优化系统的解决方案,而不是寻找可能带来的小优化。