gpt4 book ai didi

sql-server - 我可以停止调用 sp_reset_connection 以提高性能吗?

转载 作者:行者123 更新时间:2023-12-04 04:25:02 24 4
gpt4 key购买 nike

我的分析器跟踪显示 exec sp_reset_connection在每个 sql 批处理或过程调用之间调用。有reasons for it ,但是如果我确信它是不必要的,我可以防止它被调用以提高性能吗?

更新:
我认为这可以提高性能的原因有两个:

  • SQL Server 不需要重置连接状态。我认为这将是一个相对可以忽略不计的改进。
  • 减少网络延迟,因为客户端不需要向下发送 exec sp_reset_connection , 等待响应,然后发送它真正想要执行的任何 sql。

  • 第二个好处是我感兴趣的好处,因为在我的架构中,客户端有时与数据库有一定的距离。如果每个 sql 批处理或 rpc 都需要双重往返,这会使任何网络延迟的影响加倍。消除这种双重调用可能会提高性能。

    是的,我可以做很多其他事情来提高性能,例如重新构建应用程序,而且我非常喜欢解决问题的根本原因,但在这种情况下,我只想知道是否可以防止 sp_reset_connection被称为。然后我可以测试是否有任何性能改进并正确评估不调用它的风险。

    这就引出了另一个问题:与 sp_reset_connection 的网络通信是否真的像我上面概述的那样发生?即客户端是否发送 exec sp_reset_connection ,等待响应,然后发送真正的sql?或者这一切都集中在一块?

    最佳答案

    如果您使用 .NET 连接到 SQL Server,从 .NET 3.5 开始禁用额外的重置调用——请参阅 here . (属性仍然存在,但它什么也不做。)

    我猜微软意识到(正如有人在实验中所做的 here )打开门来避免重置比获得(可能)小的性能提升要危险得多。不能说我责怪他们。

    Does the client send exec sp_reset_connection, wait for a response, then send the real sql?



    编辑:我错了——见 here ——答案是否定的。

    总结:在 TDS 消息中设置了一个特殊位,指定应该重置连接,SQL Server 执行 sp_reset_connection自动。它在 Profiler 中显示为一个单独的批处理,并且总是在您要执行的实际查询之前执行,因此我的测试无效。

    是的,它是分开发送的。

    我整理了一个小 C# 测试程序来演示这一点,因为我很好奇:
    using System.Data.SqlClient;

    (...)

    private void Form1_Load(object sender, EventArgs e)
    {
    SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
    csb.DataSource = @"MyInstanceName";
    csb.IntegratedSecurity = true;
    csb.InitialCatalog = "master";
    csb.ApplicationName = "blarg";

    for (int i = 0; i < 2; i++)
    _RunQuery(csb);
    }

    private void _RunQuery(SqlConnectionStringBuilder csb)
    {
    using (SqlConnection conn = new SqlConnection(csb.ToString()))
    {
    conn.Open();

    SqlCommand cmd = new SqlCommand("WAITFOR DELAY '00:00:05'", conn);

    cmd.ExecuteNonQuery();
    }
    }

    启动 Profiler 并将其附加到您选择的实例,过滤我提供的虚拟应用程序名称。然后,在 cmd.ExecuteNonQuery(); 上放置一个断点行并运行程序。

    第一次跨步时,只运行查询,在 5 秒等待后,您得到的只是 SQL:BatchCompleted 事件。当断点第二次命中时,您在分析器中看到的仍然只是一个事件。当您再次跨过去时,您会立即看到 exec sp_reset_connection事件,然后在延迟后出现 SQL:BatchCompleted 事件。

    摆脱 exec sp_reset_connection的唯一方法调用(这对您来说可能是也可能不是合法的性能问题)将关闭 .NET 的连接池。如果您打算这样做,您可能希望构建自己的连接池机制,因为关闭它而不做任何其他事情可能会比承受额外的往返带来的伤害更大,而且您将拥有手动处理正确性问题。

    关于sql-server - 我可以停止调用 sp_reset_connection 以提高性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4004279/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com