【问题标题】:Sql Connection open slow down or make application performance betterSql Connection打开速度变慢或使应用程序性能更好
【发布时间】:2011-03-30 20:05:23
【问题描述】:

我正在查询一个表以查找应用程序中有 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应该会影响应用性能吗? 我是否需要在循环前打开连接并在循环后关闭以获得更好的应用程序性能。

【问题讨论】:

    标签: .net sql


    【解决方案1】:

    在这种特殊情况下,因为你有一个紧密的循环(嗯,它可能没有那么紧密,但你肯定在那个范围内执行了大量的操作),你应该保持连接在进入循环之前在循环外部打开,然后确保在循环完成后将其关闭。例如:

    using (var connection = new SqlConnection("connection string"))
    foreach (...)
    {
       // Do your work here.
    }
    

    虽然连接可能会或可能不会被回收/池化(取决于您的设置),但池化连接仍然存在一些开销(当您从池中拉出它们时需要重置它们),并且执行任何操作 60,000 次将有 一些 开销;你不妨把它拿出来,在你知道它不会对你产生负面影响的地方。

    另外,正如Mitch Wheathis answer 中指出的那样,重要的问题是您是否必须执行 60,000 次查询;从您的代码中可以看出,您一遍又一遍地执行 same exact 查询,而只需要一次就足够了,或者您可以将查询所需的条件收集到一个查询中,然后进行处理你的数据。

    【讨论】:

    • 这是示例查询,我没有调用相同的查询 select * from ERet where [Key] = 'CASHRET1-2' "CASHRET1-2" 是变量,每次迭代都会改变并基于根据这个查询的结果,我正在计算
    • 在这个查询中,选择 * from ERet where [Key] = 'CASHRET1-2'
    • @SHAJI P.D.:您可能需要考虑创建一个 single 查询,在其中执行select * from ERet where [Key] in (...) 之类的操作,创建参数化查询,然后预先获取结果,然后骑自行车通过。如果您在创建和断开连接时发现大量开销,或者只是对数据库进行 60K 调用(而不是一次),那么这应该有助于缓解这种情况。
    【解决方案2】:

    您正在创建 60,000 个连接,但您似乎不需要。

    做一个

    Using(open connection)
    {
       for(i = 1; i < 60,000; ++i)
       {
          query
       }
    }
    

    现在,您在循环的整个生命周期中都打开了一个连接,它会在完成后很好地处理。

    【讨论】:

    • 不创建 60,000 个连接,因为连接字符串是相同的(因此应该重复使用),而是打开和关闭 60,000 个
    【解决方案3】:

    是的,在循环之前打开连接(using())并在循环完成后关闭。

    另一方面,你为什么要那样做 60,000 次选择?

    【讨论】:

    • @SHAJI P.D.我想说 Mitch 提出了一个非常好的问题,根据对数据的处理方式,您也许可以只进行 一个 查询,然后从那里开始。
    • select * from ERet where [Key] = VariableKey 基本上我在表格中搜索特定值以进行一些计算
    • 您是否考虑过:select * from ERet where [Key] IN (list of VariableKey)?
    【解决方案4】:

    我的建议通常是衡量发生了什么,看看您是否有问题。与发生的其他事情相比,创建和关闭连接的开销完全有可能是微不足道的,并且通过重构代码以优化连接,您会错过(甚至更糟)更大的问题。

    例如 - 如果您可以在单个语句中进行选择并遍历结果集,那么您的应用程序应该运行得更快。如果您担心内存中有 500.000 条记录的记录集,请对其进行测试。

    在不测试“之前”和“之后”的情况下进行优化是没有意义的,而且往往会适得其反。

    【讨论】:

    • 这是示例查询,我没有为每次迭代调用相同的查询 select * from ERet where [Key] = 'CASHRET1-2'。 “CASHRET1-2”是变量,每次迭代都会改变,并且根据这个查询的结果我正在计算
    • 对 - 因此,根据您的伪代码,您每次循环时都会增加“CASHRET1-2”的值,检索该记录并进行一些计算。相反,您可以执行“选择” * 来自 ERET,其中键位于“CASHRET1-1”和“CASHRET1-60000”之间。这样,您可以运行单个查询、创建结果集并迭代结果集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    相关资源
    最近更新 更多