6

我有一个 ASP .NET 4.5 应用程序。维护页面上有一个文本框,允许管理用户编写直接针对 SQL Server 2008 数据库执行的 SQL。

有时,其中一位管理用户编写了一些低效的 SQL,SQL Server 进程开始耗尽服务器上的所有内存和 CPU 周期。然后我们必须启动和停止服务以使服务器再次响应。

有什么方法可以阻止这些查询消耗所有资源?这些查询返回的速度不足以让用户看到它们,因此可以取消查询。

编辑 我意识到阻止用户编写 SQL 查询会更好,但不幸的是我无法从应用程序中删除此功能。管理员用户不想接受教育。

4

5 回答 5

6

您可以在服务器级别设置查询调控器,但不确定每个用户或每个连接/应用程序限制。

http://technet.microsoft.com/en-us/magazine/dd421653.aspx

也就是说,允许用户直接输入 SQL 查询可能是一种糟糕/危险的做法。

于 2013-10-17T22:18:25.863 回答
3

首先,我将确保这些查询没有锁定任何表(对每个运行的查询使用 NOLOCK 或 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED)。

就资源而言,我会看类似资源管理器的东西。我们将其用于生产 OLTP 系统上的任何临时报告。

Pinal Dave 有一篇很棒的博客文章。您还可以查看 Technet 或其他 MS 站点,了解它是什么以及如何设置它。

http://blog.sqlauthority.com/2012/06/04/sql-server-simple-example-to-configure-resource-governor-introduction-to-resource-governor/

于 2013-10-17T22:19:16.460 回答
1
  1. 创建一个用户,该用户的权限不会超过必要的。

  2. 为用户创建一些登录数据,您不会与将编写查询的管理员共享这些数据。

  3. 创建一个面板/页面/应用程序,让他们在其中编写查询。在这里,您可以添加在 RDBMS 系统级别不可用的其他约束。

您让您的用户访问此面板/页面/应用程序,他们将通过此运行查询。如果他们做了您不希望发现的任何事情,那么您只需发布您对权限和面板/页面/应用程序的修改。

于 2013-10-17T22:56:30.713 回答
0

撇开允许用户构建和运行自己的查询的利弊不谈,一种解决方案可能是使用 SQL 2008/2012 附带的资源调控器。我认为它仅在企业版中可用,这可能意味着您无法使用它(您尚未在问题中指定版本)。

Technet有一篇关于如何管理工作负载的文章,但基本上您可以将会话(基于登录详细信息或任何其他可识别信息)限制为仅使用一定百分比的 CPU 和/或内存。

于 2013-10-20T23:00:22.007 回答
-1

防止 SQL 使用内存/CPU 的最佳方法:不要让用户运行查询。

SQL Server 应该使用它可以获得的所有内存,因此内存使用(或 CPU 使用)不会成为重新启动 SQL 的理由。

默认情况下,.NET SqlCommand 超时为 30 秒。当它超时时,查询将被取消。查询可能需要一段时间才能取消,尤其是在您进行数据修改并且必须进行回滚时。查询正在运行/取消其他用户查询时可能会被阻止。这可能会使 SQL Server 看起来好像没有响应,但最终它会完成并且您的 CPU 使用率将恢复正常。但是,内存将继续被 SQL Server 进程消耗。

于 2013-10-18T04:24:09.407 回答