运行多个SQL语句的最有效方法

时间:2011-02-14 16:07:24

标签: .net asp.net sql

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

这样做更有效的方法是什么?

4 个答案:

答案 0 :(得分:2)

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

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

你知道这里存在性能问题吗?

答案 1 :(得分:1)

我不担心它,除非你实际上发现它是一个瓶颈。默认情况下,从System.Data.SqlClient.SqlConnection类(以及我想象的其他提供程序,如Oracle)到SQL Server的连接是合并的,因此打开SqlConnection和<之间没有1:1的对应关系em>实际的数据库连接。

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

  1. 保持连接打开并重新使用(简单,但可能不会产生太大影响)
  2. 准备一个多次调用该过程的SQL批处理,减少您到服务器的往返。 (实际上可能会产生影响 - 虽然可能只有20个项目 - 但更难)
  3. 例如:

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

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

答案 2 :(得分:0)

即使你努力工作也没有那么多,但实际上并不是很多。如果您正在使用SQL服务器和ADO.NET提供程序,连接池将自动帮助您。我认为你没有太多担心。

答案 3 :(得分:0)

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