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.com2 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.不要忽视存储的配置