我正在查询表格,了解在申请中有5,00,000条记录的特定记录。 什么时候我查询
例如:
........... Some Code
for i = 0 ; i < 60,000
............. Some code
connection.Open();
select * from ERet where [Key] = Variable+i ;
connection.Close();
--------------some calculation
.............some code
next
此connection.open/close是否会影响应用程序性能? 我是否需要在循环之前打开连接并在循环之后关闭以获得更好的应用程序性能。
答案 0 :(得分:3)
在这种特殊情况下,因为你有一个紧凑的循环(好吧,它可能不是所以紧,但你肯定在那个范围内执行了大量的操作),你应该保持在进入循环之前,连接在循环外部打开,然后确保在循环完成时关闭它。例如:
using (var connection = new SqlConnection("connection string"))
foreach (...)
{
// Do your work here.
}
虽然连接可能会或可能不会被回收/合并(取决于您的设置),但池连接仍然存在一些开销(当您从池中提取它们时需要重置它们),以及执行任何事情< / em> 60,000次将有一些开销;你不妨在可能的地方把它拿出去,你知道它不会对你产生负面影响。
此外,正如Mitch Wheat中his answer所指出的那样,要问的重要问题是您是否必须执行60,000次查询;从您的代码中可以看出,您只是一次就可以执行相同的查询,或者您可能能够将查询所需的条件收集到一个查询中然后处理你的数据。
答案 1 :(得分:1)
是,在循环(using()
)之前打开连接,在循环完成后关闭。
另一方面,你为什么要这样做60,000个SELECT?
答案 2 :(得分:1)
您正在创建60,000个连接,但您似乎并不需要这样做。
做一个
Using(open connection)
{
for(i = 1; i < 60,000; ++i)
{
query
}
}
现在你已经为你的循环生命周期打开了一个连接,并且它会在完成后很好地处理。
答案 3 :(得分:0)
我的建议通常是衡量正在发生的事情,看看你是否有问题。与其他事情相比,创建和关闭连接的开销完全可能是微不足道的,并且通过重构代码来优化连接,您就会错过(甚至更糟)更大的问题。
例如 - 如果您可以在单个语句中进行选择,并迭代结果集,那么您的应用程序应该会更快。如果你担心内存中有500.000条记录的记录集 - 请测试它。
在没有“之前”和“之后”测试的情况下进行优化是没有意义的,并且通常会适得其反。