logo search
SQL2008_Administration

8.3.10. Объекты System Monitor для мониторинга работы sql Server 2008

При установке SQL Server в системный монитор добавляются счетчики производительности, позволяющие осуществлять контроль за работой служб SQL Server.

Основные счетчики SQL Server

Описание

Buffer Manager: Buffer Cache Hit Ratio (объект Менеджер буфера: процент попаданий в кэш) 

главный счетчик, который позволяет определить, достаточно ли памяти отведено самому SQL Server. В системах OLTP значение этого счетчика в течение длительного времени работы сервера должно быть выше 90 процентов. Для хранилищ данных допускаются более низкие значения

Buffer Manager: Cache Size (pages) (объект Менеджер буфера: размер кэша в страницах) 

этот счетчик показывает, сколько памяти выделено под кэш SQL Server. В идеале значение этого параметра должно быть приближено к размеру физической ОП на сервере.

SQL Server Access Methods: Page Splits/sec (объект Методы доступа SQL Server: Разбиений страниц в секунду) 

значительное увеличение этого показателя означает, что при выполнении операций вставки и изменения данных SQL Server приходится выполнять большое количество ресурсоемких операций по разбиению страниц и переносу части существующей страницы на новое место.

SQL Server Locks: Average Wait Time (ms) (объект Блокировок SQL Server: Среднее время ожидания (миллисекунд)) 

этот счетчик показывает, сколько времени в среднем процессам пользователей приходится проводить в очереди, чтобы наложить на ресурс блокировку. Максимально допустимое значения этого счетчика полностью зависит от вашей задачи, какое-то среднее значение для всех приложения здесь определить сложно. Слишком высокое значение этого счетчика может означать проблемы с блокировками в вашей базе данных.

SQL Server Access Methods: Full Scans/sec (объект Методы доступа SQL Server: Количество операций полного сканирования таблиц в секунду) 

этот счетчик определяет, сколько операций полного сканирования таблиц (без обращения к индексам) SQL Server выполняет в секунду. Для хранилищ данных такие операции совершенно нормальны и каких-то подозрений вызывать не должны. Однако если слишком большое количество операций полного сканирования проводится в базе данных, обслуживающей OLTP-систему, то, вполне возможно, индексов в базе данных недостаточно.

Просмотр значения счетчиков SQL Server

Чтобы просмотреть значения счетчиков SQL Server из кода Transact-SQL, необходимо обратиться к специальному представлению sysperfinfo в базе данных master.

К сожалению, большая часть значений счетчиков представлена в sysperfinfo в кумулятивном виде (то есть эта информация постоянно складывается с момента запуска сервера). Поэтому попытка просмотреть, к примеру, информацию счетчика Buffer cache hit ratio для объекта Buffer manager при помощи запроса вида

select * from sysperfinfo WHERE counter_name = 'Buffer cache hit ratio'

вернет вам совершенно некорректное значение (при том, что процент никак не может быть выше 100).

Пример получения информации

Предположим, что мы хотим запротоколировать информацию о количестве транзакций в секунду для базы данных Foodmart. При этом сбор информации должен производиться в течение 1 минуты, а интервал для сбора должен составлять 5 секунд. Код Transact-SQL для решения этой задачи может быть следующим:

-- Создаем временную таблицу со столбцами времени и значения счетчика

CREATE TABLE #PerfTable(ts DATETIME, TranPerSec BIGINT)

DECLARE @iVar1 INT, @iVar2 INT, @dStartTime DATETIME

-- Получаем текущее время

SET @dStartTime = getdate()

-- Получаем текущее значение счетчика и ждем 5 секунд

SELECT @iVar2=cntr_value FROM master..sysperfinfo WHERE counter_name = 'Transactions/sec' And instance_name = 'Foodmart'

WAITFOR DELAY '00:00:05'

-- Запускаем цикл, который будет работать минуту

WHILE getdate() < dateadd(mi,1,@dStartTime)

BEGIN

-- Получаем еще раз значение счетчика (когда прошло 5 секунд)

SELECT @iVar1=cntr_value FROM master..sysperfinfo WHERE counter_name = 'Transactions/sec' And instance_name = 'Foodmart'

-- Вставляем разницу между двумя значениями в таблицу #PerfTable

INSERT INTO #PerfTable (ts,TranPerSec) VALUES (getdate(), @iVar1 - @iVar2)

-- ...и записываем текущее значение в первую переменную,

SET @iVar2 = @iVar1

-- а потом опять ждем пять секунд

WAITFOR DELAY '00:00:05'

END

-- Когда цикл закончится, выводим записанные в таблицу значения

SELECT * FROM #PerfTable