我有一个ASP .NET 4.5应用程序。在维护页面上是一个文本框,允许管理用户编写直接针对SQL Server 2008数据库执行的SQL。
有时,其中一个管理用户编写了一些效率低下的SQL,SQL Server进程开始耗尽服务器上的所有内存和CPU周期。然后我们必须启动和停止服务以使服务器再次响应。
有什么方法可以阻止这些消耗所有资源的查询?这些查询的返回速度不足以让用户看到它们,因此可以取消查询。
修改 我意识到阻止用户编写SQL查询会更好,但遗憾的是我无法从应用程序中删除此功能。管理员用户不希望接受教育。
答案 0 :(得分:6)
您可以在服务器级别设置查询调控器,但不确定每个用户或每个连接/应用程序限制。
http://technet.microsoft.com/en-us/magazine/dd421653.aspx
尽管如此,允许用户直接输入SQL查询可能是一种糟糕/危险的做法。
答案 1 :(得分:3)
首先,我会确保这些查询没有锁定任何表(对于每个查询运行,使用NOLOCK或SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED。)
就资源而言,我会看一下像资源调控器这样的东西。我们将此用于生产OLTP系统的任何特别报告。
Pinal Dave有一篇很棒的博客文章。您还可以查看Technet或其他MS站点,了解它是什么以及如何设置它。
答案 2 :(得分:1)
创建一个不会超过必要的权限的用户。
为用户创建一些登录数据,您不会与将编写查询的管理员分享此信息。
创建一个面板/页面/应用程序,让他们编写查询。在这里,您可以添加在RDBMS系统级别不可用的其他约束。
您允许您的用户访问此面板/页面/应用程序,他们将通过此操作运行查询。如果他们正在做您发现的任何不受欢迎的事情,那么您只需对特权和面板/页面/应用程序发出修改。
答案 3 :(得分:0)
不考虑允许用户构建和运行自己的查询的优缺点,一种解决方案可能是使用SQL 2008/2012附带的资源调控器。我认为它仅在企业版中可用,这可能意味着您无法使用它(您没有在您的问题中指定版本)。
Technet有一篇关于如何管理工作负载的文章,但基本上你可以限制会话(基于登录详细信息或任何其他可识别的信息)仅使用一定比例的CPU和/或内存。
答案 4 :(得分:-1)
阻止SQL使用内存/ CPU的最佳方法:不要让用户运行查询。
SQL Server应该使用它可以获取的所有内存,因此内存使用(或者CPU使用情况)不是重启SQL的理由。
默认情况下,.NET SqlCommand超时为30秒。超时时查询将被取消。查询可能需要一段时间才能取消,特别是如果您要进行数据修改并且必须进行回滚。在查询正在运行/取消时,可能会阻止其他用户查询。这可能会使SQL Server看起来没有响应,但最终它将完成并且您的CPU使用率将恢复正常。但是,内存将继续由SQL Server进程使用。