Поделиться через


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

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

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

Введение

Команда DBCC MEMORYSTATUS предоставляет моментальный снимок текущего состояния памяти 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 или другими компонентами, которые выполняются в процессе (например, связанные серверы, XPs, SQLCLR, защита от вторжений или антивирусное программное обеспечение). Дополнительные сведения об устранении неполадок с нехваткой памяти см. в статье "Устранение неполадок с нехваткой памяти" в SQL Server.

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

  1. Выполните команду DBCC MEMORYSTATUS.
  2. Используйте разделы process/System Counts and Memory Manager, чтобы определить, имеется ли внешнее давление на память (например, на компьютере низкая физическая или виртуальная память, или рабочий набор SQL Server выстраивается). Кроме того, используйте эти разделы для определения объема памяти ядра СУБД SQL Server, выделенного по сравнению с общей памятью в системе.
  3. Если вы устанавливаете, что есть внешнее давление на память, попробуйте уменьшить использование памяти другими приложениями и операционной системой или добавить больше ОЗУ.
  4. Если установить, что подсистема SQL Server использует большую часть памяти (внутреннее давление на память), можно использовать оставшиеся разделы DBCC MEMORYSTATUS , чтобы определить, какие компоненты (клерк памяти, Cachestore, UserStore или Objectstore) являются крупнейшим участником этого использования памяти.
  5. Проверьте каждый компонент: MEMORYCLEARK, CACHESTORE, USERSTOREи OBJECTSTORE. Проверьте значение "Выделенные страницы", чтобы определить объем памяти, потребляемой компонентом внутри SQL Server. Краткое описание большинства компонентов памяти ядра СУБД см. в таблице типов memory Clerk .
    1. В редких случаях выделение является прямым виртуальным выделением, а не через диспетчер памяти SQL Server. В этих случаях проверьте значение "Зафиксировано виртуальной машины" в определенном компоненте вместо выделенных страниц.
    2. Если компьютер использует NUMA, некоторые компоненты памяти разбиты на узел. Например, можно наблюдать , OBJECTSTORE_LOCK_MANAGER (node 2)OBJECTSTORE_LOCK_MANAGER (node 1)и т. д. и, наконец, наблюдать OBJECTSTORE_LOCK_MANAGER (node 0)за суммарным значением каждого узла в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 считает доступную физическую память на компьютере высокой. Вот почему значение "Низкая физическая память системы" составляет 0, что означает отсутствие низкой памяти. Аналогичная логика применяется к низкому объему физической памяти и низкому объему виртуальной памяти процесса, где 0 означает, что это значение false, а 1 означает, что это верно. В этом примере оба значения имеют значение 0, что означает наличие большого количества физической и виртуальной памяти для процесса SQL Server.

Memory Manager

В этом разделе представлен пример выходных данных диспетчера памяти, который показывает общее потребление памяти 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. Резервирование виртуальной памяти фактически не использует физическую память; это просто означает, что виртуальные адреса находятся в пределах большого ОБЪЕМА. Дополнительные сведения см. в разделе 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) или виртуальную память. Таким образом, это значение близко или совпадает с выделенными виртуальными машинами, зафиксированным или заблокированным страницами. Обратите внимание, что при использовании API AWE SQL Server некоторые памяти по-прежнему выделяются диспетчером виртуальной памяти ОС и будут отражены как зафиксированные виртуальные машины.

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

  • Последняя ошибка ОС: это значение показывает последнюю ошибку ОС, которая произошла при нехватке памяти в системе. 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 и редко интересуется исследованием памяти, так как это подключение использует ограниченные ресурсы памяти. Дополнительные сведения о подключении к выделенному администратору (DAC) см. в разделе "Диагностическое подключение для администраторов баз данных".

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

  • Зарезервированная виртуальная машина: показывает виртуальное адресное пространство (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 показывает общее количество страниц памяти, выделенных определенным компонентом (clerk памяти, userstore, objectstore или cache store).

Примечание.

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

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

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

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

  • ЗарезервированНЫЙ SM: отображает вас, зарезервированный всеми clerks этого типа, использующими API сопоставленных с памятью файлов. Этот API также называется общей памятью.
  • SM-фиксация. Показывает вас, зафиксированный всеми clerks этого типа, использующими API сопоставленных с памятью файлов.

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

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

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

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

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

Кэш планов

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

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

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

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

    Примечание.

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

  • 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: показывает память, используемую таблицами сортировки.

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

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

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 Значение периодически обновляется.
  • Следующий запрос: отображает размер запроса памяти в буферах для следующего ожидающих запроса.
  • Ожидание: показывает объем памяти, который должен быть доступен для выполнения запроса, к которому ссылается значение следующего запроса. Значение "Ожидание ожидания" — это 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 единиц.
  • Получает — указывает количество единиц или слотов, приобретенных запросами для компиляции. Если три запроса в настоящее время используют память из шлюза, то получает = 3.
  • Официанты — указывает, сколько запросов ожидает памяти компиляции в шлюзе. Если все единицы в шлюзе исчерпаны, значение 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