Работа с расписаниями задач и пакетов SQL Server

Каждый экземпляр SQL Server является отдельным процессом операционной системы. Каждый экземпляр должен быть в состоянии обслужить тысячи параллельных запросов пользователей. В экземплярах SQL Server для управления указанными параллельными задачами используются потоки Microsoft Windows либо, в случае наличия соответствующих настроек, волокна. Каждый экземпляр SQL Server всегда задействует несколько потоков системных процессов. К ним относятся один или более потоков, отведенных под сервер Net-Library, сетевой поток управления вводом-выводом, а также сигнальный поток для соединения с диспетчером управления службами.

Основные сведения о планировании

Каждый экземпляр SQL Server содержит внутренний слой, представляющий собой среду, близкую к операционной системе. Указанный внутренний слой используется для планирования и синхронизации параллельно выполняемых задач без вызова функций ядра Windows. Данный внутренний слой также может быть использован для планирования работы волокон и потоков Windows. Каждый экземпляр SQL Server резервирует для выполнения запросов пользователя пул волокон или потоков Windows. Максимальный размер указанного пула задается серверной настройкой max worker threads.

Для правильного понимания процесса обработки запроса или задачи необходимо ознакомиться с представленными ниже понятиями.

  • соединение
    Соединение устанавливается в случае успешной регистрации пользователя. После его установления пользователь может вводить исполняемые инструкции Transact-SQL. Соединение обрывается в случае его удаления или при завершении сеанса пользователем.

  • пакет
    Пакет SQL состоит из одной или нескольких инструкций Transact-SQL, отправляемых с клиента на экземпляр SQL Server. Он представляет собой единицу работы, посылаемую пользователем компоненту Database Engine.

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

  • поток Windows
    Каждый поток Windows представляет собой независимый процесс выполнения задач.

  • волокно
    Волокно представляет собой упрощенный поток, для выполнения которого требуется меньшее количество ресурсов Windows и возможно переключение контекстов в пользовательском режиме. Один поток Windows может быть сопоставлен с несколькими волокнами.

  • рабочий поток
    Рабочий поток представляет собой логический поток SQL Server, внутренне сопоставленный отношением «один к одному» (1:1) с потоком Windows либо, если включен параметр lightweight pooling, с волокном. Указанное сопоставление поддерживается до тех пор, пока рабочий поток не будет освобожден в результате нехватки памяти или превышения интервала ожидания. Взаимосвязь задачи с рабочим потоком поддерживается в течение всего периода выполнения задачи.

Управление соединениями пользователей и ресурсами рабочих потоков

Даже упрощенные потоки и волокна задействуют достаточное количество ресурсов. В системах с сотнями и тысячами пользовательских соединений выделение одного рабочего потока на каждое соединение может привести к чрезмерной загрузке доступных ресурсов и в результате к снижению производительности SQL Server. Так как большую часть времени соединения находятся в состоянии ожидания пакетов, принимаемых от клиента, то выделение отдельного рабочего потока для каждого соединения является нецелесообразным. Вместо этого экземпляр SQL Server использует пул рабочих потоков. Пул рабочих потоков экземпляра должен иметь объем, достаточный для обслуживания текущего количества параллельных соединений пользователей, выполняющих пакеты. Чтобы эффективно распределить соединения пользователей между несколькими рабочими потоками в экземпляре SQL Server, параметру max worker threads необходимо задать значение по умолчанию 0. Это обеспечивает существенное снижение объема используемых ресурсов.

Настройка SQL Server на использование волокон

Параметр настройки сервера lightweight pooling определяет использование потоков или волокон Windows в SQL Server. Значением по умолчанию для данного параметра является 0. При задании данного значения экземпляр SQL Server распределяет потоки Windows между потоками исполнителя согласно значениям, указанным в параметре max worker threads. Если параметру lightweight pooling присвоено значение 1, то в SQL Server вместо потоков Windows используются волокна. Это называется работой в режиме волокон. В режиме волокон экземпляр SQL Server выделяет один поток Windows для каждого планировщика SQL, а затем для каждого рабочего потока выделяет волокно согласно значениям, указанным в параметре max worker threads. В экземпляре SQL Server для планирования и синхронизации задач используются одинаковые алгоритмы как при использовании волокон, так и при работе с потоками Windows. Выпуск SQL Server Express не поддерживает волокна. Дополнительные сведения см. в разделе Использование параметра lightweight pooling. Использовать планирование в режиме волокон для выполнения распространенных операций не рекомендуется. Это может привести к снижению производительности, мешая нормальной работе переключения контекста. Кроме того, некоторые компоненты SQL Server не выполняются правильно в режиме волокон. Дополнительные сведения см. в разделе использование упрощенных пулов.

Принципы работы с расписаниями задач и пакетов SQL Server

При подключении приложения к компоненту Database Engine ему присваивается идентификатор сеанса (SPID). Вся информация, требующаяся во время сеанса соединения, хранится и обрабатывается во внутренних структурах данных, связанных с идентификатором SPID. По получении экземпляром SQL Server клиентского пакета производится его разбивка на задачи, каждой из которых из пула рабочих потоков выделяется доступный рабочий поток. Привязка рабочего потока к задаче сохраняется в течение всего времени выполнения задачи. Рабочий поток выполняет запросы соответствующего ему планировщика SQL. В том случае, когда все рабочие потоки заняты, но при этом их количество не превышает значение параметра max worker threads, экземпляр SQL Server выделяет для нового пакета новый рабочий поток. В случае, когда все рабочие потоки заняты и при этом их количество соответствует значению параметра max worker threads, экземпляр SQL Server переводит задачу в режим ожидания до момента высвобождения рабочего потока.

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

Компонент Database Engine выполняет задания от определенного соединения только в промежутке времени между получением пакета и отправкой результатов клиенту. В течение указанного промежутка времени могут возникнуть ситуации, когда нет необходимости обрабатывать данные пакета. Например, могут появиться промежутки времени, когда компонент Database Engine находится в режиме ожидания окончания получения данных по запросу или высвобождения рабочего потока другим пакетом. Взаимосвязь задачи с рабочим потоком сохраняется даже в случае ее блокирования каким-либо ресурсом.

Когда компонент Database Engine начинает обрабатывать задачу, связанную с пакетом, происходит планирование рабочего потока, связанного с задачей. По окончании выполнения задачи рабочим потоком экземпляр SQL Server перераспределяет его на следующую задачу. В течение сеанса соединения его идентификатор SPID не изменяется. Длительные соединения могут содержать собственные пакетные задачи, выполняемые с помощью нескольких рабочих потоков. Например, задачи первого пакета могут выполняться с помощью рабочего потока worker1, а задачи второго пакета — с помощью worker2. Некоторые инструкции могут выполняться параллельно. В данном случае пакет может содержать несколько задач, одновременно выполняемых несколькими рабочими потоками.