Используйте команду DBCC MEMORYSTATUS для мониторинга использования памяти в SQL Server

В этой статье описывается использование DBCC MEMORYSTATUS команды для мониторинга использования памяти.

Оригинальная версия продукта: SQL Server
Исходный номер базы знаний: 907877

Введение

Команда DBCC MEMORYSTATUS предоставляет snapshot текущего состояния памяти Microsoft SQL Server и ОС. Он предоставляет один из наиболее подробных выходных данных распределения и использования памяти в SQL Server. Выходные данные можно использовать для устранения проблем с потреблением памяти в SQL Server или для устранения конкретных ошибок нехватки памяти. Многие ошибки нехватки памяти автоматически создают эти выходные данные в журнале ошибок. Если возникает ошибка, связанная с нехваткой памяти, можно выполнить DBCC MEMORYSTATUS команду и предоставить выходные данные при обращении к служба поддержки Майкрософт.

Выходные данные DBCC MEMORYSTATUS команды включают разделы, посвященные управлению памятью, использованию памяти, агрегированным сведениям о памяти, сведениям о буферьных пулах и сведениям о кэше процедур. Здесь также описаны выходные данные объектов глобальной памяти, объектов памяти запросов, оптимизации и брокеров памяти.

Примечание.

Монитор производительности (PerfMon) и диспетчер задач не учитывают использование полной памяти, если включен параметр Заблокированные страницы в памяти. Отсутствуют счетчики производительности, показывающие использование памяти API расширений окон адресов (AWE).

Важно!

Команда DBCC MEMORYSTATUS предназначена для диагностики служба поддержки Майкрософт. Формат выходных данных и предоставленный уровень детализации могут изменяться между пакетами обновления и выпусками продуктов. Функции, предоставляемые командой DBCC MEMORYSTATUS , могут быть заменены другим механизмом в более поздних версиях продукта. Поэтому в более поздних версиях продукта эта команда может перестать работать. Перед изменением или удалением этой команды не будет предоставляться никаких дополнительных предупреждений. Таким образом, приложения, использующие эту команду, могут прерываться без предупреждения.

Выходные DBCC MEMORYSTATUS данные команды изменились по сравнению с предыдущими выпусками SQL Server. В настоящее время он содержит несколько таблиц, которые были недоступны в более ранних версиях продукта.

Использование DBCC MEMORYSTATUS

DBCC MEMORYSTATUSобычно используется для исследования проблем с нехваткой памяти, о которых сообщает SQL Server. Нехватка памяти может возникнуть при нехватке внешней памяти извне процесса SQL Server или внутреннего давления, возникающего внутри процесса. Внутреннее давление может быть вызвано SQL Server ядром СУБД или другими компонентами, выполняемыми в процессе (например, связанными серверами, XP, SQLCLR, защитой от вторжений или антивирусным программным обеспечением). Дополнительные сведения об устранении проблем с нехваткой памяти см. в статье Устранение неполадок нехватки памяти или нехватки памяти в SQL Server.

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

  1. Выполните команду DBCC MEMORYSTATUS.
  2. Используйте разделы Количество процессов и систем и Диспетчер памяти, чтобы определить, существует ли нехватка внешней памяти (например, на компьютере не хватает физической или виртуальной памяти, или SQL Server рабочий набор вытащил). Кроме того, эти разделы используются для определения объема памяти, выделенной ядром СУБД SQL Server по сравнению с общей памятью в системе.
  3. Если вы установили, что существует нехватка внешней памяти, попробуйте уменьшить использование памяти другими приложениями и ОС или добавить больше ОЗУ.
  4. Если установить, что подсистема SQL Server использует большую часть памяти (внутренняя нехватка памяти), вы можете использовать оставшиеся разделыDBCC MEMORYSTATUS, чтобы определить, какие компоненты (клерк памяти, cachestore, UserStore или Objectstore) являются наибольшим участник этого использования памяти.
  5. Изучите каждый компонент: MEMORYCLEARK, CACHESTORE, USERSTOREи OBJECTSTORE. Изучите значение "Выделенные страницы", чтобы определить, сколько памяти компонент потребляет внутри SQL Server. Краткое описание большинства компонентов памяти ядра СУБД см. в таблице Типы Clerk памяти .
    1. В редких случаях выделение является прямым виртуальным выделением, а не через диспетчер памяти SQL Server. В таких случаях проверьте значение виртуальной машины Зафиксировано в конкретном компоненте, а не в разделе Выделенные страницы.
    2. Если компьютер использует NUMA, то некоторые компоненты памяти будут разбиты на узел. Например, можно наблюдать OBJECTSTORE_LOCK_MANAGER (node 0), , OBJECTSTORE_LOCK_MANAGER (node 1)OBJECTSTORE_LOCK_MANAGER (node 2)и т. д. и, наконец, наблюдать суммированное значение каждого узла в OBJECTSTORE_LOCK_MANAGER (Total). Лучше всего начать с раздела, который сообщает общее значение, а затем при необходимости изучите разбивку. Дополнительные сведения см. в статье Использование памяти с узлами NUMA.
  6. В некоторых разделах DBCC MEMORYSTATUS содержатся подробные и специализированные сведения о конкретных распределителях памяти. Эти разделы можно использовать для получения дополнительных сведений и дальнейшего распределения ресурсов в клерке памяти. Примерами таких разделов являются буферный пул (кэш данных и индексов), кэш процедур или кэш планов, объекты памяти запросов (предоставление памяти), очередь оптимизации и малые, а также средние и большие шлюзы (память оптимизатора). Если вы уже знаете, что определенный компонент памяти в SQL Server является источником нехватки памяти, вы можете перейти непосредственно к данному разделу. Например, если вы каким-то другим способом установили, что используется большое количество ресурсов памяти, что приводит к ошибкам памяти, можно просмотреть раздел Запрос объектов памяти .

В оставшейся части этой статьи описываются некоторые полезные счетчики в DBCC MEMORYSTATUS выходных данных, которые позволяют более эффективно диагностировать проблемы с памятью.

Количество процессов и систем

В этом разделе представлен пример выходных данных в табличном формате и описаны его значения.

Process/System Counts                Value
------------------------------------ ------------
Available Physical Memory            5060247552
Available Virtual Memory             140710048014336
Available Paging File                7066804224
Working Set                          430026752
Percent of Committed Memory in WS    100
Page Faults                          151138
System physical memory high          1
System physical memory low           0
Process physical memory low          0
Process virtual memory low           0

В следующем списке рассматриваются значения и их описания.

  • Доступная физическая память. Это значение показывает общий объем свободной памяти на компьютере. В примере объем свободной памяти составляет 5 060 247 552 байта.
  • Доступная виртуальная память. Это значение показывает общий объем свободной виртуальной памяти для SQL Server процесса 140 710 048 014 336 байт (128 ТБ). Дополнительные сведения см. в разделе Ограничения памяти и адресного пространства.
  • Доступный файл подкачки. Это значение показывает свободное пространство файлов подкачки. В примере значение равно 7 066 804 224 байт.
  • Рабочий набор. Это значение показывает общий объем виртуальной памяти, которую SQL Server процесс содержит в ОЗУ (не вытащивается), составляет 430 026 752 байта.
  • Процент зафиксированной памяти в WS. Это значение показывает, какой процент SQL Server выделенной виртуальной памяти находится в ОЗУ (или является рабочим набором). Значение 100 процентов показывает, что вся зафиксированная память хранится в ОЗУ, а 0 процентов из нее выкладываются.
  • Ошибки страниц. Это значение показывает общее количество ошибок жесткой и мягкой страницы для SQL Server. В примере значение равно 151 138.

Остальные четыре значения являются двоичными или логическими.

  • Системная физическая память с высоким значением 1 означает, что SQL Server считает доступную физическую память на компьютере высокой. Вот почему значение system physical memory low равно 0, что означает отсутствие нехватки памяти. Аналогичная логика применяется к обработке с нехваткой физической памяти и обработкой нехватки виртуальной памяти, где значение 0 означает, что это false, а 1 означает, что это верно. В этом примере оба значения — 0, что означает, что для процесса SQL Server достаточно физической и виртуальной памяти.

Диспетчер памяти

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

Memory Manager             KB
-------------------------- --------------------
VM Reserved                36228032
VM Committed               326188
Locked Pages Allocated     0
Large Pages Allocated      0
Emergency Memory           1024
Emergency Memory In Use    16
Target Committed           14210416
Current Committed          326192
Pages Allocated            161904
Pages Reserved             0
Pages Free                 5056
Pages In Use               286928
Page Alloc Potential       15650992
NUMA Growth Phase          0
Last OOM Factor            0
Last OS Error              0

В следующем списке рассматриваются значения в выходных данных и их описания:

  • Виртуальная машина зарезервирована. Это значение показывает общий объем виртуального адресного пространства (VAS) или виртуальной памяти ,зарезервированного SQL Server. Резервирование виртуальной памяти фактически не использует физическую память; это просто означает, что виртуальные адреса отводятся в сторону от большого vas. Дополнительные сведения см. в статье VirtualAlloc(), MEM_RESERVE.

  • Виртуальная машина зафиксирована. Это значение показывает общий объем виртуальной памяти (ВМ), зафиксированный SQL Server (в КБ). Это означает, что память, используемая процессом, поддерживается физической памятью или реже файлом подкачки. Ранее зарезервированные адреса памяти теперь поддерживаются физическим хранилищем; то есть они выделены. Если включен параметр "Заблокированные страницы в памяти", SQL Server использует альтернативный метод для выделения памяти, API AWE, и большая часть памяти не отражается в этом счетчике. Эти выделения см. в разделе [Выделенные заблокированные страницы](#Locked выделенные страницы). Дополнительные сведения см. в статье VirtualAlloc(), MEM_COMMIT.

  • Выделенные страницы. Это значение показывает общее количество страниц памяти, выделенных SQL Server ядре СУБД.

  • Выделенные заблокированные страницы. Это значение представляет объем памяти в килобайтах (КБ), который SQL Server выделил и заблокировал в физической ОЗУ с помощью API AWE. Он указывает, какой объем памяти SQL Server активно используется и запрашивается для хранения в памяти для оптимизации производительности. Блокируя страницы в памяти, SQL Server гарантирует, что критически важные страницы базы данных будут легко доступны и не переключаются на диск. Дополнительные сведения см. в статье Адрес памяти расширений Windows (AWE). Нулевое значение означает, что функция "заблокированные страницы в памяти" в настоящее время отключена и SQL Server использует виртуальную память. В этом случае значение "Зафиксировано на виртуальной машине" будет представлять память, выделенную SQL Server.

  • Выделенные большие страницы. Это значение представляет объем памяти, выделенной SQL Server с помощью больших страниц. Большие страницы — это функция управления памятью, предоставляемая операционной системой. Вместо стандартного размера страницы (обычно 4 КБ), эта функция использует больший размер страницы, например 2 МБ или 4 МБ. Нулевое значение указывает, что функция не включена. Дополнительные сведения см. в статье Virtual Alloc(), MEM_LARGE_PAGES.

  • Цель зафиксирована. Это значение указывает целевой объем памяти, который SQL Server планируется зафиксировать, идеальный объем памяти, SQL Server может потребляться, в зависимости от последней рабочей нагрузки.

  • Текущее зафиксированное значение. Это значение указывает объем памяти операционной системы (в КБ), которую в настоящее время зафиксировал диспетчер памяти SQL Server (выделяется в физическом хранилище). Это значение включает в себя "заблокированные страницы в памяти" (API AWE) или виртуальную память. Таким образом, это значение близко к или совпадает с выделенным выделенным виртуальным машином зафиксированным или заблокированным страницам. Обратите внимание, что когда SQL Server использует API AWE, часть памяти по-прежнему выделяется диспетчером виртуальной памяти ОС и будет отражена как зафиксированная виртуальная машина.

  • Этап роста NUMA. Это значение указывает, находится ли SQL Server в настоящее время в стадии роста NUMA. Дополнительные сведения об этом начальном наращивании памяти при наличии узлов NUMA на компьютере см. в статье Как это работает: SQL Server (локальные, внешние и внешние блоки памяти NUMA).

  • Последняя ошибка ОС. Это значение показывает последнюю ошибку ОС, которая произошла при нехватке памяти в системе. SQL Server записывает ошибку ОС и отображает ее в выходных данных. Полный список ошибок ОС см. в разделе Системные коды ошибок.

Использование памяти с узлами NUMA

За разделом Диспетчер памяти следует сводка по использованию памяти для каждого узла памяти. В системе с поддержкой неоднородного доступа к памяти (NUMA) для каждого аппаратного узла NUMA имеется соответствующая запись узла памяти. В системе SMP есть одна запись узла памяти. Тот же шаблон применяется к другим разделам памяти.

Memory node Id = 0      KB
----------------------- -----------
VM Reserved             21289792
VM Committed            272808
Locked Pages Allocated  0
Pages Allocated         168904
Pages Free              3040
Target Committed        6664712
Current Committed       272808
Foreign Committed       0
Away Committed          0
Taken Away Committed    0

Примечание.

  • Значение Memory node Id может не соответствовать идентификатору аппаратного узла.
  • Эти значения показывают память, выделенную потоками, работающими на этом узле NUMA. Эти значения не являются памятью, которая является локальной для узла NUMA.
  • Суммы зарезервированных значений виртуальной машины и значений "Зафиксировано виртуальной машины" на всех узлах памяти будут немного меньше соответствующих значений, указанных в таблице диспетчера памяти.
  • Узел NUMA 64 (узел 64) зарезервирован для приложения уровня данных и редко представляет интерес для исследования памяти, так как это подключение использует ограниченные ресурсы памяти. Дополнительные сведения о выделенном административном подключении (DAC) см. в разделе Диагностическое подключение для администраторов баз данных.

В следующем списке рассматриваются значения в выходной таблице и их описания:

  • Зарезервированная виртуальная машина. Показывает виртуальное адресное пространство (VAS), зарезервированное потоками, работающими на этом узле.
  • Виртуальная машина зафиксирована. Отображает значение VAS, зафиксированное потоками, выполняющимися на этом узле.

Агрегатная память

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

MEMORYCLERK_SQLGENERAL (node 0) KB
------------------------------  --------------------
VM Reserved                     0
VM Committed                    0
Locked Pages Allocated          0
SM Reserved                     0
SM Commited                     0
Pages Allocated                 5416

MEMORYCLERK_SQLGENERAL (node 1) KB
------------------------------- --------------------
VM Reserved                     0
VM Committed                    0
Locked Pages Allocated          0
SM Reserved                     0
SM Commited                     0
Pages Allocated                 136

MEMORYCLERK_SQLGENERAL (Total)  KB
------------------------------- --------------------
VM Reserved                     0
VM Committed                    0
Locked Pages Allocated          0
SM Reserved                     0
SM Commited                     0
Pages Allocated                 5552

Значение Pages Allocated показывает общее количество страниц памяти, выделенных определенным компонентом (клерком памяти, userstore, objectstore или хранилищем кэша).

Примечание.

Эти идентификаторы узлов соответствуют конфигурации узла NUMA компьютера, на котором выполняется SQL Server. Идентификаторы узлов включают возможные программные узлы NUMA, определенные поверх аппаратных узлов NUMA или поверх системы SMP. Сведения о сопоставлении идентификаторов узлов и ЦП для каждого узла см. в разделе Information Event ID 17152. Это событие регистрируется в журнале приложений в Просмотр событий при запуске SQL Server.

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

MEMORYCLERK_SQLGENERAL (Total)     KB
--------------------------------- --------------------
VM Reserved                        0
VM Committed                       0
AWE Allocated                      0
SM Reserved                        0
SM Commited                        0
Pages Allocated                    2928

Другие сведения в этих таблицах относятся к общей памяти:

  • SM Reserved: отображает объект VAS, зарезервированный всеми клерками этого типа, использующими API сопоставленных в памяти файлов. Этот API также называется общей памятью.
  • SM Зафиксировано: отображает значение VAS, зафиксированное всеми клерками этого типа, использующими API сопоставленных в памяти файлов.

В качестве альтернативного метода можно получить сводную информацию по каждому типу клерка для всех узлов памяти с помощью динамического административного представления sys.dm_os_memory_clerks. Для этого выполните следующий запрос:

SELECT
  TYPE,
  SUM(virtual_memory_reserved_kb) AS [VM Reserved],
  SUM(virtual_memory_committed_kb) AS [VM Committed],
  SUM(awe_allocated_kb) AS [AWE Allocated],
  SUM(shared_memory_reserved_kb) AS [SM Reserved],
  SUM(shared_memory_committed_kb) AS [SM Committed],
  -- SUM(multi_pages_kb) AS [MultiPage Allocator],          /*Applies to: SQL Server 2008   (10.0.x) through SQL Server 2008 R2 (10.50.x).*/
  -- SUM(single_pages_kb) AS [SinlgePage Allocator],        /*Applies to: SQL Server 2008   (10.0.x) through SQL Server 2008 R2 (10.50.x).*/
  SUM(pages_kb) AS [Page Allocated]                      /*Applies to: SQL Server 2012 (11.  x) and later.*/
FROM sys.dm_os_memory_clerks
GROUP BY TYPE

Сведения о буферных пулах

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

Buffer Pool                                       Pages
------------------------------------------------- ---------
Database                                          5404
Simulated                                         0
Target                                            16384000
Dirty                                             298
In IO                                             0
Latched                                           0
IO error                                          125
In Internal Pool                                  0
Page Life Expectancy                              3965

В следующем списке рассматриваются значения в выходных данных и их описания:

  • База данных: показывает количество буферов (страниц), имеющих содержимое базы данных (страницы данных и индексов).
  • Целевой объект: показывает целевой размер буферного пула (число буферов). См. раздел Целевая память, зафиксированная в предыдущих разделах этой статьи.
  • Грязный: показывает страницы, на которых есть содержимое базы данных и которые были изменены. Эти буферы содержат изменения, которые должны быть сброшены на диск, как правило, процессом контрольных точек.
  • В области ввода-вывода: показывает буферы, ожидающие ожидающей операции ввода-вывода. Это означает, что содержимое этих страниц записывается в хранилище или считывается из него.
  • Latched: отображает блокированные буферы. Буфер блокируется, когда поток считывает или изменяет содержимое страницы. Буфер также блокируется, когда страница считывается с диска или записывается на диск. Кратковременная блокировка используется для поддержания физической согласованности данных на странице во время их чтения или изменения. В отличие от этого, блокировка используется для поддержания логической и транзакционной согласованности.
  • Ошибка ввода-вывода. Отображает количество буферов, в которых могли возникнуть ошибки ОС, связанные с вводом-выводом (это не обязательно указывает на проблему).
  • Продолжительность жизни страницы. Этот счетчик измеряет время в секундах, в течение которого самая старая страница оставалась в буферном пуле.

Подробные сведения о буферьных пулах для страниц базы данных можно получить с помощью динамического административного sys.dm_os_buffer_descriptors представления. Но используйте это динамическое административное представление с осторожностью, так как оно может работать долгое время и производить огромные выходные данные, если серверу на основе SQL Server разрешено иметь в своем распоряжении много ОЗУ.

Кэш планов

В этом разделе рассматривается кэш планов, который ранее назывался кэшем процедур.

Procedure Cache         Value
----------------------- -----------
TotalProcs              4
TotalPages              25
InUsePages              0

В следующем списке рассматриваются значения в выходных данных и их описания:

  • TotalProcs: это значение показывает общее количество кэшированных объектов, которые в настоящее время находятся в кэше процедур. Это значение соответствует количеству записей в динамическом административном представлении sys.dm_exec_cached_plans .

    Примечание.

    Из-за динамического характера этой информации совпадение может быть не точным. PerfMon можно использовать для мониторинга объекта SQL Server: Plan Cache и sys.dm_exec_cached_plans динамического административного представления для получения подробных сведений о типе кэшированных объектов, таких как триггеры, процедуры и нерегламентированные объекты.

  • TotalPages: показывает накопительные страницы, используемые для хранения всех кэшированных объектов в кэше планов или процедур. Это число можно умножить на 8 КБ, чтобы получить значение, выраженное в КБ.

  • InUsePages: показывает страницы в кэше процедур, принадлежащие активным в данный момент процедурам. Эти страницы нельзя отменить.

Объекты глобальной памяти

В этом разделе содержатся сведения о различных объектах глобальной памяти и используемом ими объеме памяти.

Global Memory Objects               Buffers
----------------------------------  ----------------
Resource                            576
Locks                               96
XDES                                61
DirtyPageTracking                   52
SETLS                               8
SubpDesc Allocators                 8
SE SchemaManager                    139
SE Column Metadata Cache            159
SE Column Metadata Cache Store      2
SE Column Store Metadata Cache      8
SQLCache                            224
Replication                         2
ServerGlobal                        1509
XP Global                           2
SortTables                          3

В следующем списке рассматриваются значения в выходных данных и их описания:

  • Ресурс: показывает память, которую использует объект Resource. Он используется подсистемой хранилища для различных структур на уровне сервера.
  • Блокировки: показывает память, используемую диспетчером блокировок.
  • XDES: показывает память, используемую диспетчером транзакций.
  • SETLS: показывает память, используемую для выделения структуры ядра хранилища для каждого потока, использующего локальное хранилище потока (TLS). Дополнительные сведения см. в разделе Локальное хранилище потоков.
  • SubpDesc Allocators: показывает память, которая используется для управления вложенными процессами для параллельных запросов, операций резервного копирования, операций восстановления, операций базы данных, операций с файлами, зеркального отображения и асинхронных курсоров. Эти подпроцессы также называются "параллельными процессами".
  • SE SchemaManager: показывает память, которую диспетчер схем использует для хранения метаданных, относящихся к подсистеме хранилища.
  • SQLCache: показывает память, используемую для сохранения текста нерегламентированных и подготовленных инструкций.
  • Репликация: показывает память, которую сервер использует для внутренних подсистем репликации.
  • ServerGlobal: показывает объект глобальной памяти сервера, который используется в общих целях несколькими подсистемами.
  • XP Global: показывает память, используемую расширенными хранимыми процедурами.
  • SortTables: показывает память, используемую таблицами сортировки.

Запрос объектов памяти

В этом разделе описываются сведения о предоставлении памяти запроса. Он также включает в себя snapshot использования памяти запроса. Память запросов также называется памятью рабочей области.

Query Memory Objects (default)           Value
---------------------------------------- -------
Grants                                    0
Waiting                                   0
Available                                 436307
Current Max                               436307
Future Max                                436307
Physical Max                              436307
Next Request                              0
Waiting For                               0
Cost                                      0
Timeout                                   0
Wait Time                                 0

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

В следующем списке рассматриваются значения в выходных данных и их описания:

  • Гранты. Показывает количество выполняемых запросов с предоставленными памятью.
  • Ожидание: показывает количество запросов, ожидающих получения предоставленных памяти.
  • Доступно: отображаются буферы, доступные для запросов для использования в качестве рабочей области хэша и рабочей области сортировки. Значение Available периодически обновляется.
  • Следующий запрос: показывает размер запроса памяти (в буферах) для следующего ожидая запроса.
  • Ожидание: показывает объем памяти, который должен быть доступен для выполнения запроса, на который ссылается значение "Следующий запрос". Значение Wait For — это значение, Next Request умноженное на коэффициент запаса. Это значение фактически гарантирует, что определенный объем памяти будет доступен при выполнении следующего ожидающего запроса.
  • Затраты: показывает стоимость следующего ожидающего запроса.
  • Время ожидания: отображает время ожидания (в секундах) для следующего ожидающего запроса.
  • Время ожидания. Показывает затраченное время (в миллисекундах) с момента помещения следующего запроса ожидания в очередь.
  • Текущее максимальное значение: отображает общий объем памяти для выполнения запроса. Это значение является объединенным ограничением как для большой очереди запросов, так и для небольшой очереди запросов.

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

Память оптимизации

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

Примечание.

Этот объем не включает память, необходимую для выполнения запроса.

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

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

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

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

Optimization Queue (internal)      Value
---------------------------------- ----------------
Overall Memory                     4013162496
Target Memory                      3673882624
Last Notification                  1
Timeout                            6
Early Termination Factor           5

Small Gateway (internal)           Value
---------------------------------- ----------------
Configured Units                   32
Available Units                    32
Acquires                           0
Waiters                            0
Threshold Factor                   380000
Threshold                          380000

Medium Gateway (internal)          Value
---------------------------------- ----------------
Configured Units                   8
Available Units                    8
Acquires                           0
Waiters                            0
Threshold Factor                   12
Threshold                          -1

Big Gateway (internal)             Value
---------------------------------- ----------------
Configured Units                   1
Available Units                    1
Acquires                           0
Waiters                            0
Threshold Factor                   8
Threshold                          -1

Optimization Queue (default)       Value
---------------------------------- ----------------
Overall Memory                     4013162496
Target Memory                      3542319104
Last Notification                  1
Timeout                            6
Early Termination Factor           5

Small Gateway (default)            Value
---------------------------------- ----------------
Configured Units                   32
Available Units                    32
Acquires                           0
Waiters                            0
Threshold Factor                   380000
Threshold                          380000

Medium Gateway (default)           Value
---------------------------------- ----------------
Configured Units                   8
Available Units                    8
Acquires                           0
Waiters                            2
Threshold Factor                   12
Threshold                          -1

Big Gateway (default)              Value
---------------------------------- ----------------
Configured Units                   1
Available Units                    1
Acquires                           0
Waiters                            0
Threshold Factor                   8
Threshold                          -1

Ниже приведено описание некоторых из этих значений:

  • Настроенные единицы измерения — указывает количество одновременных запросов, которые могут использовать память компиляции из шлюза. В этом примере 32 одновременных запроса могут использовать память из малого шлюза (по умолчанию), восемь одновременных запросов из шлюза Среднего и один запрос из большого шлюза. Как упоминалось ранее, если запросу требуется больше памяти, чем может выделить малый шлюз, он будет отправляться в шлюз среднего уровня, и этот запрос принимает единицу в обоих шлюзах. Чем больше объем памяти компиляции требуется запросу, тем меньше настроенных единиц в шлюзе.
  • Доступные единицы измерения . Указывает количество слотов или единиц, доступных для параллельных запросов для компиляции из списка настроенных единиц. Например, если доступно 32 единицы, но три запроса в настоящее время используют память компиляции, то Available Units это будет 32 минус 3 или 29 единиц.
  • Acquires — указывает количество единиц или слотов, полученных запросами для компиляции. Если в настоящее время три запроса используют память из шлюза, получает значение = 3.
  • Waiters — указывает, сколько запросов ожидает памяти компиляции в шлюзе. Если все единицы в шлюзе исчерпаны, значение Waiters не равно нулю, которое показывает количество ожидающих запросов.
  • Пороговое значение — указывает ограничение памяти шлюза, определяющее, откуда запрос получает память или в каком шлюзе он остается. Если запросу требуется не больше порогового значения, он остается в небольшом шлюзе (запрос всегда начинается с малого шлюза). Если ему требуется больше памяти для компиляции, он будет переходить к среднему, а если это пороговое значение по-прежнему недостаточно, оно переходит к большому шлюзу. Для небольшого шлюза пороговый коэффициент составляет 380 000 байт (может быть изменено в будущих версиях) для платформы x64.
  • Пороговый коэффициент. Определяет пороговое значение для каждого шлюза. Для небольшого шлюза, так как пороговое значение предопределено, коэффициент также имеет то же значение. Пороговые коэффициенты для среднего и большого шлюза составляют доли общей памяти оптимизатора (общая память в очереди оптимизации) и имеют значение 12 и 8 соответственно. Таким образом, если общая память корректируется из-за того, что другие потребители памяти SQL Server требуют памяти, пороговые коэффициенты также будут приводить к динамической корректировке пороговых значений.
  • Время ожидания. Указывает значение в минутах, определяющее время ожидания запроса памяти оптимизатора. Если это значение времени ожидания достигнуто, сеанс останавливает ожидание и вызывает ошибку 8628 - A time out occurred while waiting to optimize the query. Rerun the query.

Брокеры памяти

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

MEMORYBROKER_FOR_CACHE (internal)       Value
--------------------------------------- -------------
Allocations                             20040
Rate                                    0
Target Allocations                      3477904
Future Allocations                      0
Overall                                 3919104
Last Notification                       1

MEMORYBROKER_FOR_STEAL (internal)       Value
--------------------------------------- -------------
Allocations                             129872
Rate                                    40
Target Allocations                      3587776
Future Allocations                      0
Overall                                 3919104
Last Notification                       1

MEMORYBROKER_FOR_RESERVE (internal)     Value
--------------------------------------- -------------
Allocations                             0
Rate                                    0
Target Allocations                      3457864
Future Allocations                      0
Overall                                 3919104
Last Notification                       1

MEMORYBROKER_FOR_CACHE (default)        Value
--------------------------------------- -------------
Allocations                             44592
Rate                                    8552
Target Allocations                      3511008
Future Allocations                      0
Overall                                 3919104
Last Notification                       1

MEMORYBROKER_FOR_STEAL (default)        Value
--------------------------------------- -------------
Allocations                             1432
Rate                                    -520
Target Allocations                      3459296
Future Allocations                      0
Overall                                 3919104
Last Notification                       1

MEMORYBROKER_FOR_RESERVE (default)      Value
--------------------------------------- -------------
Allocations                             0
Rate                                    0
Target Allocations                      3919104
Future Allocations                      872608
Overall                                 3919104
Last Notification                       1