MSSQL 内存压力分析


mssql内存不足的表现形式如下:

1 硬盘读超频繁 ,sql语句的逻辑读超过预期
2 执行计划经常被清除
3 sql 无缓存数据 或缓存数据时间过短 例 以前查询数据 第一次慢一点 第二次就会变快,现在每次查询都很慢



mssql内存不足原因分析:

1 db 本身内存不足
如:32位DB服务器请开启 AWE
增加DB服务器内存

添加合适的表索引,使查询减少读取页数,达到少用内存的目的


2 使用 sys.dm_os_memory_clerks 观察 db服务器实际使用的内存情况

select * from sys.dm_os_memory_clerks

3 监控内存使用比较多的sql语句
分析sql 语句使用内存的合理性,如果不合理,可以从索引优化和业务角度去改变sql语句占用内存


4 获取逻辑读写 物理读写次数最多的sql语句,分析其合理性,如下sql脚本所示

   --按照物理读的页面数排序 前50名
  SELECT TOP 50
  qs.total_physical_reads,qs.execution_count,
  qs.total_physical_reads/qs.execution_count AS [avg I/O],
  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.total_logical_reads/qs.execution_count AS [AVG IO],
  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_logical_reads DESC