限制返回给SSMS的结果集大小

3
我有一组用户可以访问生产环境的SSMS。我不能撤销他们的访问权限,但偶尔他们会运行一个足够大的查询,导致临时文件占用了C盘上所有的空闲空间并使服务器崩溃。
我正在寻找一种方法来限制任何SSMS连接返回的结果集大小小于2GB或某个类似的限制。这个问题在2005年到2014年的所有版本中都存在,因此任何版本的解决方案都将受到欢迎。
目前,我能想到的唯一缓解此问题的方法是设置一个针对大型临时结果文件的Nagios警报。
顺便提一下,我非常清楚这个问题有多糟糕,所以我不想讨论为什么会出现这种情况。

当您在SSMS中右键单击查询窗口并选择“查询选项”时,第一个选项是在SQL停止处理查询之前限制返回的行数。我没有立即找到任何东西,但我想服务器的默认值可能在某个.ini文件中,或者可能在注册表中。 - Tab Alleman
这是否是发生在特定的存储过程/表上?如果受影响的存储过程/表数量不是很多,您可以将原始存储过程包装在其他存储过程中,并使用“top x”指令执行它。例如:select top 1000 from ( spTheOriginalProcedure )。该包装器可以参数化,以便您可以控制何时获取有限的结果。但这是一个相当不专业的方法。 - PiotrWolkowski
@TabAllerman,那个选项是客户端的,不是服务端的。更改必须针对每个用户进行。 - TDavis
@TDavis,根据OP的说法,用户不断地填满C:驱动器并使服务器崩溃,我认为用户实际上是将服务器用作客户端。否则,他们只会使自己的计算机崩溃,而当他们打电话抱怨时,OP只能哈哈大笑。 - Tab Alleman
哦,那完全不同。我理解您的意思是服务器上只有一个 SSMS 的副本,人们通过远程桌面连接来使用它? - TDavis
显示剩余6条评论
1个回答

1

哦,男孩。好的。

第一步是通过系统配置限制用户可能造成的损害。通常,在设置SQL Server时,您需要有4个不同的分区:

  • 操作系统
  • 页面
  • TempDB
  • 日志
  • 数据

这样做不仅可以提高性能,而且可以防止自动增长对日志或TempDB造成OS分区的影响。当您的磁盘空间用尽时,只会杀死SQL Server实例,而不是操作系统本身。作为第一步,我会为您的Temp DB创建一个新分区并将其移动:

移动temp db的示例

至于实际限制他们可以运行的查询的大小,这并不简单。 SQL Server确实有资源管理器,可以让您按用户限制CPU利用率和磁盘利用率,但无法限制查询返回的总数据量。

MSDN上的资源管理器

最后,考虑一下他们试图通过如此大量的查询所做的事情。也许他们有错误的连接导致笛卡尔积结果,但并没有意识到这一点。考虑为他们设置一些视图来完成繁重的工作(主要是表连接等),这样他们就不再需要直接访问表格(暗示-暗示-眨眼),而且您可以更适当地管理他们在数据库中所做的操作,因为您控制着视图定义。

很遗憾,我无法影响系统的实际设计。它必须保持标准化。我只能影响引擎上的设置或管理工作室中的设置。 - Bill Hurt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接