SQL Server 中等待时间的理想值

IT *_*her 3 performance sql-server sql-server-2008-r2 wait-types

这与我自己的帖子有关

SQL server 每天早上 8:30 开始,晚上 9:30 左右停止。(所以等待时间每天都会重置) SQL server 将被大约 60 个用户同时使用(直接用于修改数据,也用于应用程序的后端数据库)我们在办公室使用)服务器有 8 GB 内存。大多数数据库每小时都会做一次日志备份。(备份由我们自己的备份工具完成,它可以自动进行 SQL 备份)

本文所述,我使用了以下查询。

select *
from sys.dm_os_wait_stats
WHERE [wait_type] NOT IN (
        N'CLR_SEMAPHORE',    N'LAZYWRITER_SLEEP',
        N'RESOURCE_QUEUE',   N'SQLTRACE_BUFFER_FLUSH',
        N'SLEEP_TASK',       N'SLEEP_SYSTEMTASK',
        N'WAITFOR',          N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
        N'CHECKPOINT_QUEUE', N'REQUEST_FOR_DEADLOCK_SEARCH',
        N'XE_TIMER_EVENT',   N'XE_DISPATCHER_JOIN',
        N'LOGMGR_QUEUE',     N'FT_IFTS_SCHEDULER_IDLE_WAIT',
        N'BROKER_TASK_STOP', N'CLR_MANUAL_EVENT',
        N'CLR_AUTO_EVENT',   N'DISPATCHER_QUEUE_SEMAPHORE',
        N'TRACEWRITE',       N'XE_DISPATCHER_WAIT',
        N'BROKER_TO_FLUSH',  N'BROKER_EVENTHANDLER',
        N'FT_IFTSHC_MUTEX',  N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
        N'DIRTY_PAGE_POLL',  N'SP_SERVER_DIAGNOSTICS_SLEEP')
order by wait_time_ms desc; 
Run Code Online (Sandbox Code Playgroud)

结果如下图(只显示前25行)

在此处输入图片说明

现在得到这个结果后,我很困惑这些值是真的很高还是正常情况。(我也获取了与 SQL 相关的性能计数器值,但无法使用它进行故障排除,因为大多数文章只描述了哪些性能计数器使用,而不是正确分析它或者我很难找到我的服务器的性能)那么这些的理想价值是多少?我的 sql server 是否有性能问题?如何决定?

Tho*_*ser 5

您应该考虑的不仅仅是 的绝对值,wait_time_ms或者waiting_tasks_count您还应该查看平均等待时间。当您查看平均等待时间时,您应该问自己:“等待此资源的时间是否合理?”

例如(如果我计算正确的话)您的PAGEIOLATCH等待时间在 4-5 毫秒之间。这是“好” - 因为这是硬盘驱动器获取 I/O 请求的响应时间。但是,如果您在 SSD 上运行(该值预计会在 1ms 范围内徘徊),则它是“坏的”。

再举一个例子,您的WRITELOG等待时间超过 10 毫秒。这是“糟糕的”,因为如果您正确执行顺序 I/O,该值(即使在旋转锈蚀上)应该真的在 1ms 范围内。

然而,所有这一切都必须在你试图实现的背景下看到。如果您希望“通常使事情更快”(并非罕见的请求),您需要首先查看最大的等待(通过 wait_time_ms),因为它们最有可能伤害您。如果您的调整更有针对性,请查看特定的等待类型,即使它们在列表中较低。

例如,您有一些LCK_M_S平均 70 毫秒的等待时间。它们看起来并不重要,因为它们太少了。但也许它们会影响一些重要的用户。如果这是一个查询应该快速进出的 OLTP 系统 - 70 毫秒是一个“坏”数字(因为短期运行事务中的锁应该只保持几毫秒甚至几微秒)。

另一个示例:如果您试图更快地进行 DML 查询,您将需要定位WRITELOGPAGEIOLATCH_EX等待。如果您正在优化读取,您将更多地关注减少PAGEIOLATCH_SH等待(例如使用 SSD 或 RAM)或使数据库执行更少的读取 I/O(例如通过优化索引)。