IO 是sql server最重要的资源, 在生产环境下数据库的sqlserver服务启动后一个星期,就可以通过dmv来分析优化。MS SQL Server提供了一些动态管理视图和函数供我们分析磁盘I/O性能。

一.按照物理读的页面数排序 前50名
SELECT TOP 50
qs.total_physical_reads,qs.execution_count,
qs.total_physical_reads/qs.execution_count AS [avg I/O],
qs. creation_time,
qs.max_elapsed_time,
qs.min_elapsed_time,
SUBSTRING(qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_offset=-1
THEN LEN(CONVERT(NVARCHAR(max),qt.text))2
ELSE qs.statement_end_offset END -qs.statement_start_offset)/2) AS query_text,
qt.dbid,dbname=DB_NAME(qt.dbid),
qt.objectid,
qs.sql_handle,
qs.plan_handle
from sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
ORDER BY qs.total_physical_reads DESC
二.按照逻辑读的页面数排序 前50名
SELECT TOP 50
qs.total_logical_reads,
qs.execution_count,
qs.max_elapsed_time,
qs.min_elapsed_time,
qs.total_logical_www.078881.cn reads/qs.execution_count AS [AVG IO],
SUBSTRING(qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_www.qinlinyule.cn offset=-1
THEN LEN(CONVERT(NVARCHAR(max),qt.text)) www.mcyllpt.com
2
ELSE qs.statement_end_offset END www.leyou2.net -qs.statement_start_offset)/2)
AS query_text,
qt.dbid,
dbname=DB_NAME(qt.dbid),
qt.objectid,
qs.sql_handle,
creation_time,
qs.plan_handle
from sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_www.fencaiyule.cn/ text(qs.sql_handle) AS qt
ORDER BY qs.total_logical_reads DESC
三.分析该语句的执行计划,如果提示缺少索引(引起i/o统计扫描次数多),查看执行计划发现是聚集索引扫描,这时通过添加索引,变成索引查找。
四.在微软的technet上有一篇关于存储的最佳实践top 10(Storage Top 10 Best Practices)是这么要求的:
  1. 了解SQL Server的IO特性和应用系统的IO需求规格。
  2. 使用更多/更快的磁盘驱动以获取良好的性能
  3. 不要过度优化存储,简单的设计通常能够提供良好的性能和灵活性。
  4. 部署前验证配置。可以用SQLIO之类的工具模拟测试。
  5. 始终把日志文件放在RAID10/RAID1上。
  6. 把日志文件和数据文件从物理磁盘上隔离。
  7. 认真考虑TempDB的数据配置。
  8. 在数据文件的数量和CPU
的容量之间平衡。
  9. 不要忽视SQL Server的基础。
  10.不要忽视存储的配置