【问题标题】:Optimizing SQL connection performance?优化 SQL 连接性能?
【发布时间】:2009-07-03 09:36:25
【问题描述】:

这不是关于优化 SQL 命令的问题。我想知道有什么方法可以确保 SQL 连接保持打开状态并准备好尽可能高效地处理命令。

我现在看到的是我可以执行一条 SQL 命令,而该命令需要大约 1 秒,额外的执行需要大约 300 毫秒。这是在先前针对 SQL 服务器(来自另一个应用程序实例)执行命令之后......因此,在此应用程序初始执行之前,应该为已执行的查询完全填充 SQL 缓存。只要我不断地重新执行查询,我会看到大约 300 毫秒的时间,但如果我让应用程序空闲 5-10 分钟并返回,下一个请求将回到 ~1 秒(与初始请求相同)。

有没有办法通过连接字符串或 SqlConnection 上的某些属性来指示框架以保持连接水合并准备好有效地处理查询?

【问题讨论】:

    标签: c# .net sql performance sqlconnection


    【解决方案1】:

    您是否检查过程序的执行计划。我认为执行计划被加载到服务器上的内存中,然后在特定时间段后或根据过程中访问的表等被清除。我们遇到过这样的案例:简化存储过程(可能拆分它们)减少了数据库服务器在计算计划时必须做的工作量......并最终减少了第一次调用过程的时间......您可以发出命令强制存储过程每次重新编译以测试您是否正在减少初始调用时间...... 我们遇到过这样的情况:存储过程的复杂性使得数据库服务器必须不断地根据不同的参数重新编译,这大大减慢了速度,拆分 SP 或将大型 select 语句简化为多个更新语句等都起到了很大的作用。

    其他想法可能会间歇性地调用一个简单的 getDate() 或类似的方法,以便 sql 服务器处于唤醒状态(希望这是有道理的)......与将 asp.net 应用程序保存在 IIS 中的内存中非常相似。

    【讨论】:

      【解决方案2】:

      .NET 连接池中打开连接的默认值为零。

      您可以将连接字符串中的此值调整为 1 或更多:

      "data source=dbserver;...Asynchronous Processing=true;Min Pool Size=1"
      

      详细了解这些options in MSDN

      【讨论】:

        【解决方案3】:

        通过不关闭它来保持它打开。 :) 但这是不可取的,因为连接池将为您处理连接管理。你启用了吗?

        【讨论】:

          【解决方案4】:

          默认情况下,ADO .NET 中启用了连接池。这将通过应用程序使用的连接字符串。更多信息Using Connection Pooling with SQL Server

          【讨论】:

            【解决方案5】:

            如果您使用多个数据库连接,它可能会更有效。拥有一个数据库连接意味着最好的访问速度总是会受到顺序限制。而拥有 >1 个连接意味着您的编译器有机会进一步优化并发访问。我猜你使用的是 .NET?

            此外,如果您重复发出相同的 SQL 语句,您的数据库服务器可能会在短时间内缓存结果,从而更快地返回结果集..

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多