从 Web 执行时查询超时,但从 SSMS 执行时速度超快

2023-12-07

我正在尝试调试我维护的 Web 应用程序中 SQL 超时的根源。我有 C# 代码的源代码,所以我确切地知道正在运行什么代码。我已将应用程序调试到执行超时的 SQL 代码的行,并观察在 SQL 探查器中运行的查询。

当从 Web 执行此查询时,它会在 30 秒后超时。然而,当我完全按照 Profiler 中显示的方式剪切/粘贴查询,并将其放入 SSMS 并运行它时,它几乎立即返回。我已将问题追溯到 Web 正在使用的连接中 ARITHABORT 设置为 OFF(也就是说,如果我在 SSMS 会话中关闭 ARITHABORT,它会运行很长时间,如果我将其重新打开,那么它会运行非常快)。然而,阅读 ARITHABORT 的描述,它似乎并不适用...我只是做了一个简单的 SELECT,并且根本没有执行任何算术...只是一个带有 WHERE 条件的 INNER JOIN:

为什么 ARITHABORT OFF 会在这种情况下导致这种行为?有什么方法可以从 SSMS 更改该连接的 ARITHABORT 设置吗?我正在使用 SQL Server 2008。


那么您的 C# 代码使用什么方法向 SQL Server 发送即席 SQL 查询?您是否考虑过使用存储过程?无论谁调用它,这都可能确保相同的性能(至少在引擎中)。

为什么? ARITHABORT 设置是优化器在确定如何执行查询(更具体地说,用于计划匹配)时查看的内容之一。缓存中的计划可能与 SSMS 具有相同的设置,因此它使用缓存的计划,但使用相反的设置,您的 C# 代码将强制重新编译(或者您可能遇到了真正的问题)BAD缓存中的计划),这在很多情况下肯定会损害性能。

如果您已经在调用存储过程(您没有发布查询,尽管我认为您有意这样做),则可以尝试将 OPTION (RECOMPILE) 添加到存储过程中的违规查询(或多个查询)。这意味着这些语句将始终重新编译,但它可以防止使用您似乎遇到的错误计划。另一种选择是确保在编译存储过程时,使用 SET ARITHABORT ON 执行批处理。

最后,您似乎在问如何更改 SSMS 中的 ARITHABORT 设置。我认为您想问的是如何在代码中强制执行 ARITHABORT 设置。如果您决定继续从 C# 应用程序发送即席 SQL,那么您当然可以以文本形式发送命令,其中包含多个用分号分隔的语句,例如:

SET ARITHABORT ON; SELECT ...

有关出现此问题的原因的更多信息,请参阅 Erland Sommarskog 的精彩文章:

  • 应用程序慢,SSMS 快?了解性能奥秘
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Web 执行时查询超时,但从 SSMS 执行时速度超快 的相关文章

  • T-SQL 是否可以通过单个快速操作进行更新/插入

    假设我有一个表 我想插入一行 新行的键可能已经与表中现有行的键匹配 在这种情况下我想更新现有行 或者 它可能不存在于表中 在这种情况下应插入新行 执行此类操作最有效的方法是什么 我想先做一个SELECT 也许与EXISTS 查看是否存在特定
  • ASP SQL Server 连接

  • SQL Server 2008 错误 233

    我正在使用以下 sql 脚本在 SQL Server 2008 中创建新登录名 CREATE LOGIN xyz WITH PASSWORD xyz DEFAULT DATABASE master DEFAULT LANGUAGE us e
  • 跨数据库的用户定义类型

    我有一个数据库 其中包含我在多个数据库中使用的常用函数 这些函数之一采用表作为参数 该参数是用户定义的类型 我想知道是否有办法从另一个数据库调用这个函数 我尝试在其他数据库中定义类型 如下所示 DECLARE bits as Common
  • IIF(...) 不是公认的内置函数

    我正在尝试在 Microsoft SQL Server 2008 R2 中使用它 SET SomeVar SomeOtherVar IIF SomeBool value when true value when false 但我收到一个错误
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 如何从代码隐藏运行存储过程(带参数 - 有返回值)?

    如何使用存储过程 带参数 具有类型的返回值int 从代码后面 我的存储过程如下所示 ALTER Procedure dbo sp Noskheh SumOfTotalPay Co ID int AS Declare Sum bigint B
  • 如何使用一个命令删除 SQL 数据库中的所有索引?

    那么 如何通过一条命令删除 SQL 数据库中的所有索引呢 我有这个命令可以获取所有 20 个左右的 drop 语句 但是如何从这个 结果集 运行所有这些 drop 语句呢 select from vw drop idnex 给我相同列表的另
  • 如何在 SQL Server 中不循环更新列?

    出于性能角度的考虑 我只需要删除循环并使用一些联接或其他解决方案来更新 Result 表中的数据并获得循环返回的相同结果 标量函数 CREATE FUNCTION MultiplyerScl a INT b INT RETURNS INT
  • 需要在 SQL Server 中透视字符串值

    我有一个包含值的表 描述为 Occupation String Name String Developer A Developer B Designer X Coder Y Coder Z 我需要数据透视格式的值 Designer Deve
  • 通过 ASP.NET 网站管理员工具获得 Asp.Net 会员资格

    我使用 aspnet regsql 创建了一个数据库 该数据库是在 sql server 2008 中创建的 而不是在我的项目中的数据文件夹中创建的 我需要手动将其移动到该文件夹 吗 接下来 在网站管理工具中 我转到提供商部分并单击 测试
  • 消息 203,级别 16,状态 2,不是有效标识符

    我收到以下错误 消息 203 级别 16 状态 2 过程 getQuestion 第 18 行名称 select top 1 from tlb Question inner join tlb options on tlb options q
  • 如何向 SQL 连接字符串添加自定义属性?

    我想在 SqlServer 连接字符串中添加一些自定义属性 如下所示 Integrated Security SSPI Extended Properties SomeAttr SomeValue Persist Security Info
  • Oracle OLE DB 提供程序未在 SSIS 中列出

    我在 SSIS 和 VS2015 CM 方面遇到问题 我有一个包需要连接 Oracle 来获取一些数据 我安装了适用于 Win64 的 ODAC 和 Oracle 客户端 但看不到提供程序列表中列出的 OLE DB 的 Oracle 提供程
  • TransactionScope 是否需要开启 DTC 服务?

    根据我的阅读 为了在 NET 中使用 TransactionScope 您需要运行 Windows 中的分布式事务协调器服务 我有那个服务关掉 并且我的应用程序似乎运行相同并且回滚事务没有问题 我错过了什么吗 它如何能够发挥作用呢 我正在运
  • 重用 t-sql 游标的起始位置?

    我正在开发一个在临时表上使用游标的存储过程 我已经阅读了一些关于为什么不需要游标的内容 但在这种情况下我相信我仍然需要使用游标 在我的过程中 我需要遍历表的行两次 声明游标后 已经单步执行临时表并关闭游标 重新打开时游标的位置是否仍保留在表
  • 什么会阻止 Docker 容器中运行的代码连接到单独服务器上的数据库?

    我有一个在 Ubuntu 14 04 上的 Docker 容器中运行的 NET Core 1 1 应用程序 它无法连接到在单独服务器上运行的 SQL Server 数据库 错误是 未处理的异常 System Data SqlClient S
  • SQL Server 文件操作?

    使用 SQL Server 2005 如何使用 T SQL 将文件读入 SPROC 所以 假设我有一个像这样的 CSV 文件 ID OtherUselessData 1 asdf 2 asdf 3 asdf etc 我基本上想这样做 Sel
  • 如何使用 SQL 查询创建逗号分隔的列表?

    我有 3 个表 名为 应用程序 ID 名称 资源 id 名称 应用程序资源 id app id resource id 我想在 GUI 上显示所有资源名称的表格 在每一行的一个单元格中 我想列出该资源的所有应用程序 以逗号分隔 所以问题是
  • 替换字符串中的多个字符,而不使用任何嵌套替换函数

    我的表中存储了一个方程 我一次获取一个方程 并希望将所有运算符替换为任何其他字符 输入字符串 N 100 6858 6858 N 100 0 2 N 35 运算符或模式 替换字符 输出字符串 N 100 6858 6858 N 100 0

随机推荐