1. MSSQL性能:缺失的计数器
在MSSQL数据库管理员的日常工作中,监控数据库的性能指标是非常重要的一环。然而,有时我们可能无法收集到某些计数器的数据,导致无法得到全面准确的性能数据。这篇文章将介绍几种可能会丢失的MSSQL计数器,以及如何解决这些问题。
1.1 SQLServer:Access Methods
Access Methods计数器的意义:Access Methods计数器提供MSSQL数据库引擎用来访问数据的信息。该计数器提供的数据可以告诉您有关索引扫描和索引查找等信息。
为什么可能会丢失:Access Methods计数器依赖于SQL Server 明确指定的临时表。如果某个计数器的临时表已被删除,那么相应的计数器将无法收集数据。
解决方案:在SQL Server上的性能日志中,为SQLServer:Access Methods计数器重新启用适当的ObjectName。
exec sp_configure 'show advanced options', 1;
reconfigure;
GO
exec sp_configure 'allow updates', 0;
reconfigure;
GO
DROP TABLE #AccessMethods;
CREATE TABLE #AccessMethods(PerfTime DATETIME2, SQLCompiles BIGINT, SQLReCompiles BIGINT, SQLRefreshStats BIGINT, SQLPlanStatAll BIGINT, SQLExecutions BIGINT, SQLCacheHitRatio BIGINT, SQLCacheMisRatio BIGINT, SQLCachePersRatio BIGINT );
INSERT INTO #AccessMethods(PerfTime, SQLCompiles, SQLReCompiles, SQLRefreshStats, SQLPlanStatAll, SQLExecutions, SQLCacheHitRatio, SQLCacheMisRatio, SQLCachePersRatio) SELECT PerfTime,SQLCompiles,SQLReCompiles,SQLRefreshStats,SQLPlanStatAll,SQLExecutions,SQLCacheHitRatio,SQLCacheMisRatio,SQLCachePersRatio FROM sys.dm_os_performance_counters WHERE Counter_name = 'Access Methods/sec';
GO
1.2 SQLServer:Buffer Manager
Buffer Manager计数器的意义:Buffer Manager分析SQL Server缓冲池的性能,缓存数据页以减少磁盘I/O使用率。
为什么可能会丢失:如果SQL Server实例重新启动,那么缓存中所有已缓存的数据都会丢失(缓存页计数将恢复为0),可以将所有缓存页计数设置为0。
解决方案:对于Buffer Manager计数器,您可以通过查询sys.dm_os_sys_memory的total_physical_memory_kb列来获得服务器可用的内存。可以使用下面的SQL脚本重建该计数器:
DROP TABLE #BufferManager;
CREATE TABLE #BufferManager(PerfTime DATETIME2, DatabasePages BIGINT, ReservedPages BIGINT, FreePages BIGINT, StolenPages BIGINT, PageLifeExpectancy BIGINT, PageLookupsPersec BIGINT, PageReadsPersec BIGINT, PageWritesPersec BIGINT, CheckpointPagesPersec BIGINT, PageFileBytes BIGINT, PageFileBytesInUse BIGINT, PercentPageFileUsed BIGINT, PageFaultsPersec BIGINT );
INSERT INTO #BufferManager(PerfTime, DatabasePages, ReservedPages, FreePages, StolenPages, PageLifeExpectancy, PageLookupsPersec, PageReadsPersec, PageWritesPersec, CheckpointPagesPersec, PageFileBytes, PageFileBytesInUse, PercentPageFileUsed, PageFaultsPersec) SELECT PerfTime,DatabasePages,ReservedPages,FreePages,StolenPages,PageLifeExpectancy,PageLookupsPersec,PageReadsPersec,PageWritesPersec,CheckpointPagesPersec,PageFileBytes,PageFileBytesInUse,PercentPageFileUsed,PageFaultsPersec FROM sys.dm_os_performance_counters WHERE Counter_name = 'Buffer Manager:Page life expectancy';
GO
1.3 MSSQL:Memory Manager
Memory Manager计数器的意义:Memory Manager分析MSSQL实例对物理内存的使用情况,以提供有关MSSQL实例的内存使用率的信息。
为什么可能会丢失:当SQL Server实例重新启动时,Memory Manager计数器的缓存会被清除。
解决方案:为Memory Manager计数器重新启用适当的ObjectName,使用以下SQL脚本重建Memory Manager计数器:
DROP TABLE #MemoryManager;
CREATE TABLE #MemoryManager(PerfTime DATETIME2, TargetServerMemoryKB BIGINT, TotalServerMemoryKB BIGINT, MemoryGrantsPending BIGINT, MemoryGrantsOutstanding BIGINT);
INSERT INTO #MemoryManager(PerfTime, TargetServerMemoryKB, TotalServerMemoryKB, MemoryGrantsPending, MemoryGrantsOutstanding) SELECT PerfTime,TargetServerMemoryKB,TotalServerMemoryKB,MemoryGrantsPending,MemoryGrantsOutstanding FROM sys.dm_os_performance_counters WHERE Counter_name = 'Memory Manager:Memory Grants Pending' OR Counter_name = 'Memory Manager:Memory Grants Outstanding';
GO
1.4 SQLServer:SQL Statistics
SQL Statistics计数器的意义:SQL Statistics计数器提供有关SQL语句的信息,例如SQL Compilations/sec和SQL Re-Compilations/sec。
为什么可能会丢失:如果某个计数器的临时表已被删除,那么相应的计数器将无法收集数据。
解决方案:在SQL Server上的性能日志中,为SQLServer:SQL Statistics计数器重新启用适当的ObjectName。
DROP TABLE #SQLStats;
CREATE TABLE #SQLStats(PerfTime DATETIME2, SQLCompiles BIGINT, SQLReCompiles BIGINT, SQLRefreshStats BIGINT, SQLPlanStatAll BIGINT, SQLExecutions BIGINT );
INSERT INTO #SQLStats(PerfTime, SQLCompiles, SQLReCompiles, SQLRefreshStats, SQLPlanStatAll, SQLExecutions) SELECT PerfTime,SQLCompiles,SQLReCompiles,SQLRefreshStats,SQLPlanStatAll,SQLExecutions FROM sys.dm_os_performance_counters WHERE Counter_name = 'SQL Statistics: SQL Compilations/sec';
GO
2. 结论
对MSSQL性能的监测对于DBA来说是非常重要的。各类计数器的重要作用不言而喻。但是,我们也应该注意到计数器的丢失和如何解决这些问题,因为缺失的计数器可能会影响我们对MSSQL实例的性能监测。