【问题标题】:Most efficient way to run several SQL statements运行多个 SQL 语句的最有效方法
【发布时间】:2011-02-14 16:07:23
【问题描述】:

我需要为列表中的每个项目运行一个存储过程(来自 ASP .NET 应用程序)。我有一个服务框架,它允许我用最少的代码行来做到这一点,但我担心使用这种方法会效率低下。每次调用服务方法,都会打开一个数据库连接,运行存储过程,然后关闭数据库连接。这很安全,但调用 20 个项目可能有点慢,我需要尽可能快。

什么是更有效的方法?

【问题讨论】:

    标签: .net asp.net sql


    【解决方案1】:

    好吧,如果您使用的是 ADO.Net,那么即使您正在“关闭”连接 ADO.Net 引擎默认情况下只会将连接放回其缓存(连接池)以供重用,所以它不是没你想的那么贵……

    但是,如果您想避免每个项目的往返,请将所有项目传递给一个管道分隔列表(或其他一些技术),并编写一个存储过程,在一个集合中一次处理它们 -基于操作。这将使您获得最佳性能。

    您知道这里根本存在性能问题吗?

    【讨论】:

    • 我还不知道存在性能问题,但我之前多次调用这样的方法时遇到过问题,即使列表只有 20-50 个项目。但是,我认为实际的存储过程在这种情况下花费了大部分时间,现在我考虑了一下。
    • 好吧,那么在我花费任何努力“修复”这样的性能问题之前,我会首先验证是否存在问题。通常,除非合并过程涉及数万次操作。每个原子操作的额外往返性质只是整体延迟的一小部分。
    【解决方案2】:

    除非您确实发现它是一个瓶颈,否则我不会担心它。默认情况下,从 System.Data.SqlClient.SqlConnection 类(以及我想像 Oracle 等其他提供程序)到 SQL Server 的连接是池化的,因此打开 SqlConnectionactual 数据库连接。

    不过,严格来说,它确实需要 一些 时间(即使它可能可以忽略不计),因此使其更快的唯一方法是:

    1. 保持连接打开并重新使用它(简单,但可能不会有太大的不同)
    2. 准备一个多次调用该过程的 SQL 批处理,从而减少到服务器的往返次数。 (实际上可能会产生影响——尽管可能不止 20 项——但更困难)

    例如:

    using(SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = @"
    exec YourProcedure @param1;
    exec YourProcedure @param2;
    exec YourProcedure @param3;";
    
        cmd.ExecuteNonQuery();
    }
    

    但是,鉴于您的项目数量可能是动态的,您基本上必须动态生成此 SQL(尽管仍然参数化所有用户提供的值!)。

    【讨论】:

      【解决方案3】:

      即使您努力工作但效率低下,20 项也不算多。如果您使用 SQL Server 和 ADO.NET 提供程序,连接池将自动帮助您.我认为您不必担心太多。

      【讨论】:

        【解决方案4】:
        1. 您可以将数据写入表 并通过一个电话处理所有这些 程序。
        2. 您可以更改客户端代码以重用连接。
        3. 如果您通过 SQL 检索数据, 用函数替换过程 (可以包含在 SQL 中) 所以数据库引擎可以流水线 来电。
        4. 您可以更改要采取的程序 所有数据作为参数,所以你 只需要一个电话。

        【讨论】:

          猜你喜欢
          • 2020-10-16
          • 2015-11-16
          • 2015-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多