自动拒绝某些昂贵的查询语句

MrC*_*vin 6 sql-server extended-events

我有一些客户有时会运行一些“不允许”的非常昂贵的查询。

我已经使用扩展事件追踪到了它们。

是否可以自动拒绝这些查询?我知道 SQL 语句,因此可以使用 EE 中的“sql_text”事件来捕获它们。

但是我还没有找到一种在 EE 中执行任何操作的方法,例如在发生特定事件时。

或者还有其他方法可以解决这个问题吗?

Pau*_*ite 7

主要选项是查询调控器成本限制资源调控器

前者有点受限,因为它适用于所有查询并根据估计成本对其进行限制,这可能非常不准确。

此外,SET QUERY_GOVERNOR_COST_LIMIT 0连接时SQL Server Management Studio 会出现问题(SSMS 选项设置为默认值)。这会覆盖实例级设置,因此使此选项非常无效。

与以下结合使用时,更好的选择是资源调控器(如果它对您可用):

更新将 CPU 超时设置添加到 SQL Server 2014、2016 和 2017 中的资源调控器工作组 REQUEST_MAX_CPU_TIME_SEC

跟踪标记(TF)2422被使能,并且如果请求超过了最大时间设定REQUEST_MAX_CPU_TIME_SEC,则该请求将被中止。此外,您可能会收到类似于以下内容的错误消息 10961:

请求已中止,因为其 CPU 使用率超过了工作负载组的最大配置限制。

使用扩展事件无法管理此问题。

Dominique Boucher描述了您的其他选项:

为什么不简单地与那些运行这些查询的人交谈并告诉他们不要呢?[...] 在您告诉他们不要并且应该这样做之后,从那些运行查询的人那里删除访问权限。否则,[...] 您可以拥有一个一直运行的作业并检查正在运行的查询并杀死您不需要运行的查询。它们仍然会开始执行,但从技术上讲,最终用户会一直遇到错误,因此他们最终可能会放弃。

Erik Darling也有类似的建议:

如果我提前知道查询文本,我可能只是在代理作业中设置一个 while 循环来查找这些查询何时执行、收集 SPID 并终止会话。