Для более качественного анализа производительности СУБД при работе с 1С рекомендуется настроить мониторинг некоторых показателей. Такой мониторинг будет полезен при использовании большого количество баз и поможет быстро вычислить именно ту базу, которая потребляет большое (аномальное) количество ресурсов.
Показывает, какие именно запросы выполняются наиболее часто (10 штук).
1. Топ баз по нагрузке CPU
Показывает затраченное процессорное время на каждую базу, а также % процессорного времени в разрезе каждой базы.WITH DB_CPU_Stats
AS
(SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], SUM(total_worker_time) AS [CPU_Time_Ms]
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID]
FROM sys.dm_exec_plan_attributes(qs.plan_handle)
WHERE attribute = N'dbid') AS F_DB
GROUP BY DatabaseID)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
DatabaseName, [CPU_Time_Ms],
CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);
2. Топ запросов нагружающих CPU за последний час
Показывает запросы, которые нагружали процессор за последний час (10 штук).SELECT TOP 10 [Average CPU used] = total_worker_time / qs.execution_count ,[Total CPU used] = total_worker_time ,[Execution count] = qs.execution_count ,[Individual Query] = 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) ,[Parent Query] = qt.text ,DatabaseName = DB_NAME(qt.dbid) FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt ORDER BY [Average CPU used] DESC;
3. Топ наиболее часто выполняемых запросов
Профессиональный ИТ-аутсорсинг: обслуживание инфраструктуры, проактивная поддержка, безопасность
Ваш штатный сисадмин не справляется? Экспертный аутсорсинг для AI, 1С и интернет-магазинов. Цена фиксирована, риски — нулевые. Узнайте стоимость
SELECT TOP 10
[Execution count] = execution_count
,[Inpidual Query] = 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)
,[Parent Query] = qt.text
,DatabaseName = DB_NAME(qt.dbid)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY [Execution count] DESC;
4. Топ баз по нагрузке RAM
Выводит перечень баз и объем cache, который они используют.SELECT
DB_NAME(database_id) AS [DatabaseName],
SUM(CAST(size_in_bytes AS DECIMAL(18,2)) / POWER(1024, 3)) AS [CacheSize_GB]
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
GROUP BY database_id
ORDER BY [CacheSize_GB] DESC;
5. Топ баз по нагрузке DISK
Показывает перечень баз и количество операций чтения и записи в них.SELECT TOP 10
[Total Reads] = SUM(total_logical_reads)
,[Execution count] = SUM(qs.execution_count)
,DatabaseName = DB_NAME(qt.dbid)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
GROUP BY DB_NAME(qt.dbid)
ORDER BY [Total Reads] DESC;
SELECT TOP 10
[Total Writes] = SUM(total_logical_writes)
,[Execution count] = SUM(qs.execution_count)
,DatabaseName = DB_NAME(qt.dbid)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
GROUP BY DB_NAME(qt.dbid)
ORDER BY [Total Writes] DESC;
