May 17, 2026, 11:40 PM

This commit is contained in:
Paweł Domański
2026-05-18 06:40:19 +00:00
commit 64944cf004
896 changed files with 310709 additions and 0 deletions
@@ -0,0 +1,320 @@
--=========================================--
/*** SQL SERVER MEMORY MONITORING QUERIES ***/
--=========================================--
-- Supported Versions SQL server 2008 and higher
-------------------------------------------------
----------------------------------
/*** 1. System Memory Status ***/
----------------------------------
SELECT total_physical_memory_kb / 1024 AS
[Total Physical Memory],
available_physical_memory_kb / 1024 AS
[Available Physical Memory],
total_page_file_kb / 1024 AS
[Total Page File (MB)],
available_page_file_kb / 1024 AS
[Available Page File (MB)],
100 - ( 100 * Cast(available_physical_memory_kb AS DECIMAL(18, 3)) / Cast
(
total_physical_memory_kb AS DECIMAL(18, 3)) ) AS
'Percentage Used',
system_memory_state_desc AS
[Memory State]
FROM sys.dm_os_sys_memory;
---------------------------------------
/*** 2. SQL Server's memory Status ***/
---------------------------------------
-- this will show how much memory allocated to SQL Server , Buffer pool commit.
-- SQL server 2008 and earlier
SELECT
(bpool_committed*8)/1024.0 as [Buffer Pool Committed (MB)],
(bpool_commit_target*8)/1024.0 as [Buffer Pool Committed Targer (MB)]
FROM sys.dm_os_sys_info;
-- SQL Server 2012 and later
SELECT
(committed_kb)/1024.0 as [Buffer Pool Committed (MB)],
(committed_target_kb)/1024.0 as [Buffer Pool Committed Targer (MB)]
FROM sys.dm_os_sys_info;
----------------------------------------------
/*** 3. Physical Memory Used By SQL Sever***/
----------------------------------------------
-- Find the actual Memory used by SQL Server
select
convert(decimal (5,2),physical_memory_in_use_kb/1048576.0) AS 'Physical Memory Used By SQL (GB)',
convert(decimal (5,2),locked_page_allocations_kb/1048576.0) As 'Locked Page Allocation',
convert(decimal (5,2),available_commit_limit_kb/1048576.0) AS 'Available Commit Limit (GB)',
page_fault_count as 'Page Fault Count'
from sys.dm_os_process_memory;
------------------------------------------
/*** 4. Buffer Pool Usage By Databases ***/
------------------------------------------
DECLARE @total_buffer INT;
SELECT @total_buffer = cntr_value
FROM sys.dm_os_performance_counters
WHERE RTRIM([object_name]) LIKE '%Buffer Manager'
AND counter_name = 'Database Pages';
;WITH DBBuffer AS
(
SELECT database_id,
COUNT_BIG(*) AS db_buffer_pages,
SUM (CAST ([free_space_in_bytes] AS BIGINT)) / (1024 * 1024) AS [MBEmpty]
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id
)
SELECT
CASE [database_id] WHEN 32767 THEN 'Resource DB' ELSE DB_NAME([database_id]) END AS 'DataBase Name',
db_buffer_pages AS 'DB Buffer Pages',
db_buffer_pages / 128 AS 'DB Buffer Pages Used (MB)',
[mbempty] AS 'DB Buffer Pages Free (MB)',
CONVERT(DECIMAL(6,3), db_buffer_pages * 100.0 / @total_buffer) AS 'DB Buffer Percentage'
FROM DBBuffer
ORDER BY [DB Buffer Pages Used (MB)] DESC;
--------------------------------------------
/*** 5. Memory Used By Database Objects ***/
--------------------------------------------
;WITH obj_buffer
AS (SELECT [Object] = o.NAME,
[Type] = o.type_desc,
[Index] = COALESCE(i.NAME, ''),
[Index_Type] = i.type_desc,
p.[object_id],
p.index_id,
au.allocation_unit_id
FROM sys.partitions AS p
INNER JOIN sys.allocation_units AS au
ON p.hobt_id = au.container_id
INNER JOIN sys.objects AS o
ON p.[object_id] = o.[object_id]
INNER JOIN sys.indexes AS i
ON o.[object_id] = i.[object_id]
AND p.index_id = i.index_id
WHERE au.[type] IN ( 1, 2, 3 )
AND o.is_ms_shipped = 0)
SELECT obj.[object],
obj.[type],
obj.[index],
obj.index_type,
Count_big(b.page_id) AS 'Buffer Pages',
Count_big(b.page_id) / 128 AS 'Buffer MB'
FROM obj_buffer obj
INNER JOIN sys.dm_os_buffer_descriptors AS b
ON obj.allocation_unit_id = b.allocation_unit_id
WHERE b.database_id = Db_id()
GROUP BY obj.[object],
obj.[type],
obj.[index],
obj.index_type
ORDER BY [buffer pages] DESC;
----------------------------------------
/*** 6. Costliest Stored Procedures ***/
----------------------------------------
-- Based on Logical reads
SELECT TOP(25) p.NAME AS [SP Name],
qs.total_logical_reads AS
[TotalLogicalReads],
qs.total_logical_reads / qs.execution_count AS [AvgLogicalReads],
qs.execution_count AS 'execution_count',
qs.total_elapsed_time AS
'total_elapsed_time',
qs.total_elapsed_time / qs.execution_count AS 'avg_elapsed_time'
,
qs.cached_time AS
'cached_time'
FROM sys.procedures AS p
INNER JOIN sys.dm_exec_procedure_stats AS qs
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = Db_id()
ORDER BY qs.total_logical_reads DESC;
----------------------------------------------
/*** 7. Top Performance Counters Memory ***/
----------------------------------------------
-- Get size of SQL Server Page in bytes
DECLARE @pg_size INT,
@Instancename VARCHAR(50)
SELECT @pg_size = low
FROM master..spt_values
WHERE number = 1
AND type = 'E'
-- Extract perfmon counters to a temporary table
IF Object_id('tempdb..#perfmon_counters') IS NOT NULL
DROP TABLE #perfmon_counters
SELECT *
INTO #perfmon_counters
FROM sys.dm_os_performance_counters;
-- Get SQL Server instance name as it require for capturing Buffer Cache hit Ratio
SELECT @Instancename = LEFT([object_name], ( Charindex(':', [object_name]) ))
FROM #perfmon_counters
WHERE counter_name = 'Buffer cache hit ratio';
SELECT *
FROM (SELECT 'Total Server Memory (GB)' AS Counter,
( cntr_value / 1048576.0 ) AS Value
FROM #perfmon_counters
WHERE counter_name = 'Total Server Memory (KB)'
UNION ALL
SELECT 'Target Server Memory (GB)',
( cntr_value / 1048576.0 )
FROM #perfmon_counters
WHERE counter_name = 'Target Server Memory (KB)'
UNION ALL
SELECT 'Connection Memory (MB)',
( cntr_value / 1024.0 )
FROM #perfmon_counters
WHERE counter_name = 'Connection Memory (KB)'
UNION ALL
SELECT 'Lock Memory (MB)',
( cntr_value / 1024.0 )
FROM #perfmon_counters
WHERE counter_name = 'Lock Memory (KB)'
UNION ALL
SELECT 'SQL Cache Memory (MB)',
( cntr_value / 1024.0 )
FROM #perfmon_counters
WHERE counter_name = 'SQL Cache Memory (KB)'
UNION ALL
SELECT 'Optimizer Memory (MB)',
( cntr_value / 1024.0 )
FROM #perfmon_counters
WHERE counter_name = 'Optimizer Memory (KB) '
UNION ALL
SELECT 'Granted Workspace Memory (MB)',
( cntr_value / 1024.0 )
FROM #perfmon_counters
WHERE counter_name = 'Granted Workspace Memory (KB) '
UNION ALL
SELECT 'Cursor memory usage (MB)',
( cntr_value / 1024.0 )
FROM #perfmon_counters
WHERE counter_name = 'Cursor memory usage'
AND instance_name = '_Total'
UNION ALL
SELECT 'Total pages Size (MB)',
( cntr_value * @pg_size ) / 1048576.0
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Buffer Manager'
AND counter_name = 'Total pages'
UNION ALL
SELECT 'Database pages (MB)',
( cntr_value * @pg_size ) / 1048576.0
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Buffer Manager'
AND counter_name = 'Database pages'
UNION ALL
SELECT 'Free pages (MB)',
( cntr_value * @pg_size ) / 1048576.0
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Buffer Manager'
AND counter_name = 'Free pages'
UNION ALL
SELECT 'Reserved pages (MB)',
( cntr_value * @pg_size ) / 1048576.0
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Buffer Manager'
AND counter_name = 'Reserved pages'
UNION ALL
SELECT 'Stolen pages (MB)',
( cntr_value * @pg_size ) / 1048576.0
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Buffer Manager'
AND counter_name = 'Stolen pages'
UNION ALL
SELECT 'Cache Pages (MB)',
( cntr_value * @pg_size ) / 1048576.0
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Plan Cache'
AND counter_name = 'Cache Pages'
AND instance_name = '_Total'
UNION ALL
SELECT 'Page Life Expectency in seconds',
cntr_value
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Buffer Manager'
AND counter_name = 'Page life expectancy'
UNION ALL
SELECT 'Free list stalls/sec',
cntr_value
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Buffer Manager'
AND counter_name = 'Free list stalls/sec'
UNION ALL
SELECT 'Checkpoint pages/sec',
cntr_value
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Buffer Manager'
AND counter_name = 'Checkpoint pages/sec'
UNION ALL
SELECT 'Lazy writes/sec',
cntr_value
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Buffer Manager'
AND counter_name = 'Lazy writes/sec'
UNION ALL
SELECT 'Memory Grants Pending',
cntr_value
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Memory Manager'
AND counter_name = 'Memory Grants Pending'
UNION ALL
SELECT 'Memory Grants Outstanding',
cntr_value
FROM #perfmon_counters
WHERE object_name = @Instancename + 'Memory Manager'
AND counter_name = 'Memory Grants Outstanding'
UNION ALL
SELECT 'process_physical_memory_low',
process_physical_memory_low
FROM sys.dm_os_process_memory WITH (nolock)
UNION ALL
SELECT 'process_virtual_memory_low',
process_virtual_memory_low
FROM sys.dm_os_process_memory WITH (nolock)
UNION ALL
SELECT 'Max_Server_Memory (MB)',
[value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)'
UNION ALL
SELECT 'Min_Server_Memory (MB)',
[value_in_use]
FROM sys.configurations
WHERE [name] = 'min server memory (MB)'
UNION ALL
SELECT 'BufferCacheHitRatio',
( a.cntr_value * 1.0 / b.cntr_value ) * 100.0
FROM sys.dm_os_performance_counters a
JOIN (SELECT cntr_value,
object_name
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Buffer cache hit ratio base'
AND object_name = @Instancename + 'Buffer Manager')
b
ON a.object_name = b.object_name
WHERE a.counter_name = 'Buffer cache hit ratio'
AND a.object_name = @Instancename + 'Buffer Manager') AS D;