8

我正在运行 SQL Server 2008 企业版,并希望通过动态管理视图(从 SQL 内部)监控以下性能指标:

滑动时间窗口的每个数据库文件的平均/最大读/写I/O 等待时间(以毫秒为单位)。

即:每个数据库文件 4 个数字:平均读取等待、最大读取等待、平均写入等待、最大写入等待。全部以毫秒为单位,并且全部用于一些理智的(甚至更好的可配置的)滑动时间窗口。

我怎样才能做到这一点?

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

PS2:至少有 1 个工具(用于 SQL Server 的 Quest Spotlight 7)能够为每个数据库文件提供 Max I/O Wait(以毫秒为单位)。所以必须有某种方式..

4

4 回答 4

4

下面是 SSMS 的 Activie Monitor 使用的查询。他们将 io_stall 字段标记为总等待时间。您可以添加fs.io_stall_read_msandfs.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; 

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

于 2012-11-27T18:09:38.777 回答
2

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

于 2012-11-27T21:42:49.490 回答
2

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

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

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

于 2012-11-29T04:24:31.653 回答
2

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

于 2012-11-30T02:59:09.267 回答