是否可以拒绝对特定视图的过大查询?

时间:2015-06-14 05:39:53

标签: sql sql-server tsql denial-of-service

我正在使用MS-SQL Server,我们有几个视图有可能返回大量已处理的数据,足以使我们的服务器在单个查询中连续30分钟将资源使用率提高到100%(如果不负责任地询问。)

绝对没有商业案例需要从这些视图中返回如此大量的数据,因此我们想将其锁定以确保没有人可以通过简单的方式来帮助我们的SQL服务器(有意或无意)没有适当的where条款等查询这些特定的观点。

是否可以通过触发器或其他方法检查where子句等,并确认给定查询是否“安全”执行(基于我们确定的阈值),如果是,则拒绝查询不符合我们的指导方针?

或者我们可以根据估计的完成时间等配置服务器拒绝给定的执行计划吗?

3 个答案:

答案 0 :(得分:4)

降低来自某一群人的某些查询的总体成本的一种可能方法是使用资源调控器。您可以限制特定用户/组使用的CPU和/或内存量。如果你有一个“狂野的西部”环境,有些用户会提交错误的查询,让你的资源充满活力,这是有效的。请参阅here

要考虑的另一件事是设置MAXDOP(最大并行度)以防止任何单个查询占用所有可用的CPU线程。也就是说,如果MAXDOP为1,则任何查询只能处理2个CPU线程。这对于防止大型查询允许较小的快速处理非常有用。请参阅here

答案 1 :(得分:3)

有点hacky但是在每个视图中都放了一个顶部x

您不能在SQL端强制执行它,但在应用程序大小上,他们可以使用TimeOut。但如果他们缺乏QC,他们可能缺乏TimeOut的纪律。如果您有一些查询需要30分钟,他们可能会设置一个比默认值更长的值。

答案 2 :(得分:1)

在每个视图中,我都不相信Blam的顶级X.如果没有相应的ORDER BY子句,数据将以不确定的顺序返回。 CDC的MAXDOP建议可能会有所帮助。与其本身不同,但对于想要同时运行的其他查询。

我倾向于考虑转向存储过程。然后,您可以在查询运行之前需要输入参数并对其进行评估。例如,如果日期范围太大,您可以限制它。您还应该了解谁在运行昂贵的查询以及他们真正需要什么。似乎他们可能从某些ETL中受益。只是一些想法。