Обнаружение использования SQL Server с запросом

Мой текущий проект будет отправлять запросы на сервер sql постоянно, и он может использовать 100% памяти или процессора.

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

  • Если нет, как я могу предотвратить использование SQL-сервера для полного использования?

Дополнительная информация о деле: Сейчас я знаю, что наш текущий тестовый сервер может обрабатывать 40-50 запросов в секунду (одна конкретная хранимая процедура). И теперь мы решим, сколько запросов отправляется на сервер каждую секунду. Если мы установим сумму, даже на 1 превышающую ожидаемую, в конечном счете, запросы в конечном итоге заполнят виртуальную память, и клиент должен будет периодически перезапускать экземпляр сервера SQL.

Ожидаемые результаты (для охотников за головами):

@memory_usage float, @cpu_usage float; /* in percentage */

Любые идеи приветствуются. Спасибо.

Ответ 2

Для любого такого интенсивного использования SQL Server и усилий по его тонкой настройке я предполагаю, что (виртуальная) машина предназначена для SQL Server.

Сказав это, получение текущего процентного значения процессора и используемой памяти должно сделать трюк:

CREATE PROCEDURE dbo.p_GetSystemUsage
    @cpuUsage float out,   -- % CPU usage
    @memoryUsage float out -- % memory usage
AS
BEGIN
    SET NOCOUNT ON;

    /*
     * % CPU usage
     */

    SELECT TOP 1
        @cpuUsage = 100 - r.SystemIdle
    FROM (
        SELECT
            rx.record.value('(./Record/@id)[1]', 'int') AS record_id,
            rx.record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle
        FROM (
            SELECT CONVERT(XML, record) AS record
            FROM sys.dm_os_ring_buffers
            WHERE
                ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND
                record LIKE '%<SystemHealth>%') AS rx
        ) AS r
    ORDER BY r.record_id DESC

    /*
     * % memory usage
     */

    SELECT
        @memoryUsage =
            (((m.total_physical_memory_kb - m.available_physical_memory_kb) /
              convert(float, m.total_physical_memory_kb)) *
             100)
    FROM sys.dm_os_sys_memory m
END

Несколько замечаний:

  • sys.dm_os_sys_memory является хорошим источником использования физической памяти машины. Он предоставляет аналогичную информацию об использовании файла страницы машины. По моему опыту, его информация часто меняется - несколько запросов к ней в течение второй секунды дают разные результаты.
  • sys.dm_os_ring_buffers - хороший источник использования процессора, но он не обновляется так часто - каждую минуту из того, что я видел. Возможно, вы можете повлиять на это, если вам нужна более подробная информация в режиме реального времени.
  • Значение использования ЦП в sys.dm_os_ring_buffers является целым числом, но я сделал @cpuUsage a float за вашу спецификацию. Поскольку хранимый proc использует два параметра float, вы можете реорганизовать определение использования ЦП для предоставления дробной части без изменения ее вызывающих абонентов.

Ответ 3

Не уверен, как это сделать в SQL, но вы всегда можете создать функцию на С#, а затем сделать ее доступной на вашем SQL Server в качестве хранимой процедуры с помощью CRL.

http://msdn.microsoft.com/en-us/library/ms131094.aspx