我有一些客户有时会运行一些“不允许”的非常昂贵的查询。
我已经使用扩展事件追踪了它们。
是否可以自动拒绝这些查询?我知道 SQL 语句,因此可以使用 EE 中的“sql_text”事件来捕获它们。
但是我还没有找到一种方法来在 EE 中执行任何操作,例如发生特定事件时。
或者还有其他方法可以解决这个问题吗?
我有一些客户有时会运行一些“不允许”的非常昂贵的查询。
我已经使用扩展事件追踪了它们。
是否可以自动拒绝这些查询?我知道 SQL 语句,因此可以使用 EE 中的“sql_text”事件来捕获它们。
但是我还没有找到一种方法来在 EE 中执行任何操作,例如发生特定事件时。
或者还有其他方法可以解决这个问题吗?
主要选项是查询调控器成本限制和资源调控器。
前者有点受限,因为它适用于所有查询并根据估计的成本限制它们,这可能非常不准确。
此外,连接时 SQL Server Management Studio 会出现问题
SET QUERY_GOVERNOR_COST_LIMIT 0
(SSMS 选项设置为默认值)。这会覆盖实例级设置,因此使此选项非常无效。结合以下内容时,更好的选择是资源调控器(如果您可以使用):
更新将 CPU 超时设置添加到 SQL Server 2014、2016 和 2017 中的资源调控器工作组 REQUEST_MAX_CPU_TIME_SEC
无法使用扩展事件来管理它。
Dominique Boucher描述了您的其他选项:
Erik Darling也有类似的建议:
governor_cost_limit
谢谢保罗,我在 SSMS 中进行测试时遇到了麻烦,但正如你所说,SSMS 似乎推翻了服务器范围的设置。我在这里找到了 SSMS 中的选项:
当然还有 GUI 中的服务器范围选项(在服务器的属性中):
通过 SQL 语句设置:
来自learn.microsoft.com
设置 SSMS 选项后,它现在在我进行测试时启动。它将几乎立即取消查询(当服务器计算出估计值时),而不是在查询经过指定秒数时。我从服务器得到这个“错误”:
期待收到来自抱怨的客户的第一封邮件/电话。我在这些超时 SQL 问题上浪费了几个小时。