1

很抱歉介绍了这么长,但在我提出问题之前,我认为提供背景信息将有助于更好地理解我们的问题。

我们将 sql server 2008 用于我们的 Web 服务作为后端,并且有时需要花费太多时间来响应应该运行得非常快的请求,例如查询表的选择请求需要超过 20 秒只有 22 行。我们经历了许多可能导致问题的潜在领域,从索引到存储过程、触发器等,并尝试优化我们可以删除不经常读取但经常写入的索引或为我们的选择查询添加 NOLOCK 以减少锁定表(我们可以接受脏读)。

我们还让我们的 DBA 审查了服务器并对组件进行了基准测试,以查看 CPU、内存或磁盘子系统中的任何瓶颈,并发现在硬件方面我们也可以。而且由于偶尔会出现问题,因此很难在生产或开发中重现错误,因为大多数情况下,当我们重新运行相同的查询时,它会产生我们期望的响应时间,这些响应时间很短,而不是已经较早经历。

话虽如此,我几乎一直对 I/O 持怀疑态度,尽管它似乎不是瓶颈。但我认为我只是能够在服务器上为特定表运行索引碎片报告后重现该错误,这立即导致请求中的峰值不仅针对该表运行,而且在查询其他表的其他请求中也出现。而且由于数据库和服务器与我们使用的其他应用程序共享,并且有时查询可以在服务器和数据库上运行,这对我们来说是一个常见的场景,我怀疑偶尔的 I/O 瓶颈是,我相信,成为一个事实。

因此,我想找到一种方法来优先处理来自 Web 服务的请求,即使有其他资源敏感查询正在运行,这些请求也会被处理。从解决过程一开始,我就一直在寻找我上面描述的某种优先级,并发现 SQL Server 2008 有一个称为“资源调控器”的功能,它允许对请求进行优先级排序。

但是,由于我不是 Resource Governor 方面的专家,也不是 DBA,所以我想问问其他可能使用过或正在使用 Resource Governor 的人的经验,以及我是否可以为特定登录或特定的 I/O 优先级存储过程(例如,如果在我们收到 Web 服务请求时正在运行一个 I/O 密集型进程,SQL Server 是否可以停止或减慢该进程的 I/O 活动并优先处理我们的请求?刚刚收到?)。

感谢任何花时间阅读或提前提供帮助的人。

一些硬件细节:
CPU:2x 四核 AMD Opteron 8354
内存:64GB
磁盘子系统:Compaq EVA8100 系列(我不确定,但它应该是 8 个 HP HSV210 SCSI 驱动器上的 RAID 0+1)

PS:而且我几乎可以 100% 确定应用程序服务器没有导致错误,并且我们可以确定那里没有瓶颈。

更新1:

对于gbn在下面提出的以下问题,我将尽我所能回答。如果您正在寻找其他东西,请告诉我。

1)请问您有什么样的索引和统计维护?
我们有一个每周运行的作业,每周五对索引进行碎片整理。除此之外,还启用了自动创建统计信息和自动更新统计信息。并且峰值也发生在碎片作业之外的其他时间。

2)你有什么样的写入数据量?
很难回答。除了我们的 Web 服务之外,还有一个访问相同数据库的前端应用程序,据我所知,需要定期运行资源密集型查询,但是,我不知道如何获取,比如说每周或每天,将金额写入数据库。

3) 您是否分析过重新编译和统计更新事件?
很抱歉无法弄清楚这一点。我不明白你在问这个问题。如果可能的话,你能提供更多关于这个问题的信息吗?

4

2 回答 2

1

第一个想法是统计数据正在更新,因为达到了数据更改阈值导致重新构建执行计划。

  • 请问您有什么样的索引和统计维护?注意:索引维护更新索引统计信息,而不是列统计信息:您可能需要单独的统计信息更新。
  • 你有什么样的写入数据量?
  • 您是否分析过重新编译和统计更新事件?
于 2010-11-15T18:30:56.450 回答
0

针对您对原始问题的更新的问题 3),请查看 SQL Server Pedia 上的以下参考。它解释了查询重新编译是什么,并继续解释如何监视这些事件。我相信 gbn 的要求(请随时纠正我先生 :-) )是您是否在缓慢执行麻烦的查询之前看到重新编译事件。您可以使用 SQL Server Profiler 查找是否发生这种情况。

重新编译查询执行计划的原因

于 2010-11-20T12:36:16.793 回答