Paging File:%Usage
SQL Server: Buffer Manager: Buffer cache hit
SQL Server: Buffer Manager: Page life expectancy
SQL Server: Memory Manager: Memory Grants Pending
首先先检查Memory: Available Mbytes,这个值意味着系统的可用内存。如果发现这个值经常很低,可能表示服务器内存不足,在生产数据库中,这个值可以使用GB为单位。
然后检查Memory: Pages/sec ,以为这因为硬页面错误导致的从磁盘读或写页面。这个值如果长期高于20,意味着内存不足使得应用程序使用虚拟内存,从而导致挂起。
接着是Memory: pages/sec ,同时也要检查Paging File:%Usage去预估内存挂起。如果这个值经常超过20%,可能意味着内存不足。
SQL Server: Buffer Manager: Buffer cache hit ratio:意味着数据从缓存中读取的次数,比较合理的值为大于90%。如果该值很低,可能内存不足或者需要检查索引和查询。如果你需要获得大量数据,这一步可能就会占用大量内存然后引起SQLServer从磁盘读数据而不是从内存。检查索引,确保在大表中能尽可能笔描扫描。并尽可能限制查询返回的结果行。
检查SQL Server: Buffer Manager: Page life expectancy,表示数据页驻留在内存的秒数。微软建议最少300秒。如果在一个实例中经常低于300秒,意味着数据保留的时间少于5分钟就被移出内存。
如果SQL Server: Memory Manager: Memory Grants Pending经常建议等待进程,你可能需要增加服务器的内存了。
2、设置SQLSERVER 的最大使用内存,并重启sqlserver服务器,从而使得数据库使用的内存超过最大设置内存时,自动实现内存回收。
由于当前数据库服务器的内存是16G,为其他程序预留了4G的程序,所以数据库的最大使用程序设置为12G
3、查看连接数
select * from sysprocesses where dbid in (select dbid from sysdatabases where name='MyDatabase') 查看连接数,通过连接数的分析确定数据库的链接程序是否正确。如果连接数过多,资源得不到释放,说明有问题。
4、查看等待类型
SELECT TOP 10 * FROM SYS.dm_os_wait_stats ORDER BY wait_time_ms DESC
分析:通过等待类型,分析SQLSERVER 的耗时操作存在的类型:
SELECT
(physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB, (locked_page_allocations_kb/1024) AS Locked_pages_used_Sqlserver_MB, (total_virtual_address_space_kb/1024) AS Total_VAS_in_MB, process_physical_memory_low, process_virtual_memory_low FROM sys.dm_os_process_memory;5、查看耗时SQL
SELECT SS.SUM_EXECUTION_COUNT,
T.TEXT,
SS.SUM_TOTAL_ELAPSED_TIME,
SS.SUM_TOTAL_WORKER_TIME,
SS.SUM_TOTAL_LOGICAL_READS,
SS.SUM_TOTAL_LOGICAL_WRITES
FROM (SELECT S.PLAN_HANDLE,
SUM(S.EXECUTION_COUNT)SUM_EXECUTION_COUNT,
SUM(S.TOTAL_ELAPSED_TIME)SUM_TOTAL_ELAPSED_TIME,
SUM(S.TOTAL_WORKER_TIME)SUM_TOTAL_WORKER_TIME,
SUM(S.TOTAL_LOGICAL_READS)SUM_TOTAL_LOGICAL_READS,
SUM(S.TOTAL_LOGICAL_WRITES)SUM_TOTAL_LOGICAL_WRITES
FROM SYS.DM_EXEC_QUERY_STATS S
GROUP BY S.PLAN_HANDLE
) AS SS
CROSS APPLY SYS.dm_exec_sql_text(SS.PLAN_HANDLE)T
ORDER BY SUM_TOTAL_LOGICAL_READS DESC
通过此语句可以查看耗时的SQL语句,根据SQL优化的规则进行针对性的SQL优化。另,SQLSERVER的性能杀手:
1)低质量的索引
2)不精确的统计
3)过多的阻塞和死锁
4)低质量的查询涉及
总结:
SQLSERVER 的性能优化是一个复杂的过程,其中的核心关键包括三个:1)减少全表检索的次数 2)减少数据获取的数量3)尽可能的采用线程池实现数据库链接,并及时的关闭数据链接,方式内存溢出.当发现瓶颈后,针对性的优化算法或者硬件吞吐量做出针对性的扩展.
知识扩展
SQLser的内存管理
SQL Server的内存管理设计的原则:1)减少磁盘读取和写入IO次数 2)减少数据检索的时间。数据的内存管理机制采用页式管理机制,分为数据页和检索页。相应的内存的索引分为聚集索引和非聚集索引,聚集索引与数据的存储相关,而非聚集索引与索引页相关与存储无关。数据库的IO操作分为分页读和分页写。分页读采取预读、读取索引页、读取数据页和高级扫描,其中涉及的创新技术包括高速缓存预读机制、数据读取分析合并机制、数据索引引用机制和全表共享访问机制。
分页写分为逻辑写入和磁盘写入,数据写入高速缓存时发生逻辑写入,数据由高速缓存写入磁盘时发生磁盘写入。写入的核心是维护逻辑写入和磁盘写入的一致性。写的过程包括形成脏数据和及时的事务日志、查找聚集写入页的脏数据、写入磁盘数据。写入磁盘数据包括惰性写入、勤奋写入和检查点写入,为了保证高效的操作,全部采用异步操作.