最佳代码 - 一个大型查询,但更复杂的数据检索或许多小查询

时间:2009-11-10 09:39:49

标签: c# .net sql sql-server

我有一个C#程序,它从数据库中检索多行,但目前在同一个连接上一次执行一行。

编写它是否更好,而不是重复运行(每次更改blah):

select data from table where name = 'blah'

类似于:

select name, data from table where name in ('blah','blah2','blah3')

我对进行此更改感到紧张,因为我不确定从结果表中检索此数据的额外开销。

请注意,示例数据并不代表实际数据,所以我不能做任何事情:

select name, data from table where name like 'blah%'

此外,这是一个高度紧张的环境,所以即使是最轻微的改善也可能是非常有益的。

提前致谢, 汤姆

7 个答案:

答案 0 :(得分:2)

我会选择一个粗短的请求。至少从性能的角度来看,这是更好的方法。

答案 1 :(得分:2)

一次访问数据库比多次小命中更有效。

答案 2 :(得分:2)

我希望使用单个语句来产生更好的性能,并且您将减少与语句准备,提交和执行相关的开销。但是,与任何优化一样 - 您应该尝试并在提交之前对其进行测量。

您可能还想查看准备和提交一批语句,而不是单独提出请求。此外,对于第一种情况,请检查您是否正在准备语句一次并缓存预准备语句 - 从而节省了重复编译语句的开销。

答案 3 :(得分:2)

理论上,单个查询更好。即使数据库中的处理时间相同,也可以避免数据库服务器和客户端之间的多次往返通信,从而节省资源和时间。

也就是说,这是一种需要进行性能分析以实际衡量所做任何更改的改进的问题。

答案 4 :(得分:1)

参数化查询既快又安全。它缓存查询计划并防范SQL injection

SELECT name, data
FROM table
WHERE name in (@name1, @name2, @name3)

在调用代码中,您可以根据需要添加参数。例如(C#):

var command = connection.CreateCommand();
command.CommandText = "SELECT name, data FROM table WHERE name in (";
int index = 0;
string separator = "";
foreach (string value in valueList)
{
   string paramName = "@p" + Convert.ToString(index);
   command.CommandText += separator + paramName;
   command.Parameters.Add(paramName, value);
   separator = ", ";
   index++;
}
command.CommandText += ")";

答案 5 :(得分:0)

我要去做一个叫

的操作
select data from table... etc.etc.

通过存储过程:然后,您可以修改SQL逻辑(可能的优化),而无需更改前端代码中的任何内容。

答案 6 :(得分:0)

一个陈述是最好的,并通过数据库优化..