SQL SERVER 性能优化

来源:互联网 发布:淘宝简介怎么写 编辑:程序博客网 时间:2024/05/02 00:03
1、性能指标监控
    1)打开perfmon.exe性能监视器
    2)添加性能指标
  Memory: Available Mbytes
 Memory: Pages/sec
 Paging File:%Usage
 SQL Server: Buffer Manager: Buffer cache hit
 SQL Server: Buffer Manager: Page life expectancy
 SQL Server: Memory Manager: Memory Grants Pending
   3)数据分析
     在本文中,再次使用了可靠性和性能监视器这个工具。为了获取内存相关的性能计数器,需要在图形化界面中观察这些计数器。

    首先先检查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;  
查看sqlserver的内存结构,通过内存结构分析SQLServer的内存情况

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操作分为分页读和分页写。分页读采取预读、读取索引页、读取数据页和高级扫描,其中涉及的创新技术包括高速缓存预读机制、数据读取分析合并机制、数据索引引用机制和全表共享访问机制。

分页写分为逻辑写入和磁盘写入,数据写入高速缓存时发生逻辑写入,数据由高速缓存写入磁盘时发生磁盘写入。写入的核心是维护逻辑写入和磁盘写入的一致性。写的过程包括形成脏数据和及时的事务日志、查找聚集写入页的脏数据、写入磁盘数据。写入磁盘数据包括惰性写入、勤奋写入和检查点写入,为了保证高效的操作,全部采用异步操作.