SQL Server 2008:每个数据库文件的I / O等待时间

时间:2012-11-22 09:20:03

标签: sql sql-server sql-server-2008

我正在运行SQL Server 2008 Enterprise Edition,并希望监控以下性能指标,即通过动态管理视图(在SQL中):

  

平均/最大读/写 I / O等待,ms 每个数据库文件   用于滑动时间窗口。

即:每个数据库文件4个数字:avg read wait,max read wait,avg write wait,max write wait。全部以毫秒为单位,全部用于一些理智(甚至更好的可配置)滑动时间窗口。

我该怎么做?

PS:我拥有VIEW SERVER STATE权限,可以阅读sys.dm_os_performance_counterssys.database_filessys.dm_io_virtual_file_stats

PS2:至少有一个工具(SQL Server的Quest Spotlight 7)能够以每个数据库文件的毫秒数提供最大I / O等待。所以必须有某种方式..

4 个答案:

答案 0 :(得分:4)

以下是SSMS的Activie Monitor使用的查询。它们将io_stall字段标记为总等待时间。您可以添加fs.io_stall_read_msfs.io_stall_write_ms字段以获取读/写特定数字。

SELECT     
    d.name AS [Database], 
    f.physical_name AS [File], 
    (fs.num_of_bytes_read / 1024.0 / 1024.0) [Total MB Read], 
    (fs.num_of_bytes_written / 1024.0 / 1024.0) AS [Total MB Written], 
    (fs.num_of_reads + fs.num_of_writes) AS [Total I/O Count], 
    fs.io_stall AS [Total I/O Wait Time (ms)], 
    fs.size_on_disk_bytes / 1024 / 1024 AS [Size (MB)],
    fs.io_stall_read_ms
FROM sys.dm_io_virtual_file_stats(default, default) AS fs
INNER JOIN sys.master_files f ON fs.database_id = f.database_id AND fs.file_id = f.file_id
INNER JOIN sys.databases d ON d.database_id = fs.database_id; 

此查询仅为您提供总计。您必须以某个间隔运行它并将结果记录在带有时间戳的临时表中。然后,您可以根据需要查询此表以获取最小值/最大值/平均值。滑动时间窗口只是您在该表中保留的数据量以及查询的时间段的函数。

答案 1 :(得分:2)

您将遇到的问题是SQL不一定跟踪您希望获得的每个文件的详细程度。您可能还必须使用性能监视器。您将不得不使用组合方法查看性能监视器,以了解磁盘上I / O的详细信息。以及前面提到的SQL监控技术,可以看到更完整的图片。我希望有所帮助。

答案 2 :(得分:2)

您可以使用几个脚本来提取指标。我已经使SQL Server 8内置的数据收集/数据收集服务器变得困难。它从多个实例收集指标并将它们存储在您指定为收集器的mssql服务器中。为每个实例提供的报告足以满足大多数目的。我确信有第三方工具超出了数据收集器的功能,因为它只是在没有性能提示的情况下报告性能/磁盘使用情况/查询统计信息。

这为日志和数据文件提供了数据文件增长预测和增长事件摘要,但是,我不知道它是否会为您提供每个文件或文件组所需的指标:)

注意:如果使用数据收集仓库,则应考虑随着大小的增加定期重建索引。它收集约。我的senario中每天20 MB的数据。

答案 3 :(得分:2)

请参阅以下内容,了解每个文件的等待统计信息http://msdn.microsoft.com/en-us/library/ms187309(v=sql.105).aspx