Обсудить
бизнес-задачи

Оптимизация использования RAM в SQL Server

блог о bi, №1 в рунете
Оптимизация использования оперативной памяти (RAM) в SQL Server является ключевым аспектом для обеспечения высокой производительности баз данных. Неправильная настройка использования оперативной памяти может привести к серьезным проблемам с производительностью, которые негативно сказываются на опыте работы конечных пользователей.
Вот как это может проявляться:

  • Замедление ответа на запросы
  • Увеличение времени ожидания
  • Снижение общей производительности системы
  • Повышение вероятности сбоев

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

Буферы страниц

Буферы страниц являются одним из основных механизмов, с помощью которых SQL Server управляет использованием памяти. Они представляют собой область памяти, где хранятся данные и объекты базы данных, которые недавно были прочитаны или записаны. Основная цель буферов страниц — минимизировать количество обращений к диску, что значительно увеличивает скорость обработки запросов. Рассмотрим, как работают буферы страниц и что такое «buffer cache hit ratio».

Как работают буферы страниц

  • Хранение данных: страницы данных и индексов считываются с диска в буферный пул SQL Server. Измененные страницы (так называемые "грязные страницы"), которые были изменены после последнего сохранения на диск, также хранятся в буфере перед тем, как быть записанными обратно на диск.

  • Управление памятью: буферный пул служит основным источником размещения памяти SQL Server. Управление буфером включает в себя два основных механизма: диспетчер буферов для доступа к страницам баз данных и их обновления, и сам буферный пул для сокращения операций ввода-вывода базы данных.

  • Обработка "грязных" страниц: если в системе возникает нехватка памяти, активные "грязные" страницы удаляются из буферного кэша, записываются на диск и затем считываются обратно в кэш. Это помогает управлять использованием памяти и предотвращает переполнение буфера.

Оптимизация «buffer cache hit ratio»

«Buffer cache hit ratio» — это метрика, показывающая эффективность использования буферов страниц. Эта метрика выражается в процентах и в идеале должна стремиться к 100%, что указывает на то, что практически все обращения к данным происходят из буфера, минимизируя необходимость в физических чтениях с диска.

Чтобы максимизировать «buffer cache hit ratio», можно принять следующие меры:
1. Правильная настройка памяти сервера:
Убедитесь, что SQL Server имеет достаточно памяти для эффективного использования буферов страниц. Параметр maximum server memory (in MB) в SQL Server Management Studio позволяет установить максимальное количество памяти, которую SQL Server может использовать. Для этого необходимо выполнить следующие действия:

  • Запустить утилиту SQL Server Management Studio.
  • Щелкнуть правой кнопкой мыши по серверу баз данных.
  • В открывшемся меню выбрать пункт Properties.
  • В открывшемся окне Server Properties выбрать страницу Memory (1).
  • В поле Maximum server memory (in MB) ввести требуемый объем оперативной памяти в мегабайтах (2).
  • Нажать на кнопку ОК (3)
2. Обновление статистики:
Регулярное обновление статистики данных помогает SQL Server принимать более информированные решения о том, какие данные следует загружать в буфер. Это особенно важно для больших баз данных, где изменения в данных происходят регулярно.

Для обновления статистики в SQL Server используется команда UPDATE STATISTICS. Эта команда позволяет обновить статистические данные для указанного объекта базы данных.
Пример обновления статистики для таблицы Sales:
Если вы хотите обновить статистику для всех объектов в определенной схеме, используйте ключевое слово ALL:
3. Оптимизация запросов:
Избегайте ненужных сканирований и используйте индексы там, где это возможно. Это помогает уменьшить количество данных, которые нужно загрузить в буфер, увеличивая вероятность cache hit – ситуации, когда система или приложение успешно получает данные из кэша памяти, а не из основного хранилища данных.

Предположим, у нас есть таблица Employees с миллионами строк, и мы хотим найти всех сотрудников, чей возраст превышает 30 лет. Если у нас нет индекса на столбец Age, то SQL Server будет выполнять полное сканирование таблицы, что крайне неэффективно для больших объемов данных.
Для оптимизации этого запроса мы можем добавить индекс на столбец Age, что позволит SQL Server быстро находить соответствующие строки без необходимости сканировать всю таблицу.

Memory Grants

Что такое «Memory Grants» и «Memory Grants Pending»?

В контексте SQL Server, "гранты памяти" (memory grants) относятся к объему памяти, который SQL Server выделяет для выполнения отдельных операций запроса. Например, операция сортировки может потребовать определенного количества памяти для временного хранения данных, а операция хэширования — другого объема памяти. Эти гранты памяти обычно выделяются из общего пула памяти, доступного для SQL Server.

Метрика «Memory Grants Pending» в SQL Server относится к ситуации, когда запросы на использование памяти для выполнения операций ожидают выделения памяти. Оптимальное значение должно стремиться к 0. Это состояние может возникнуть, когда система достигает своего максимального уровня использования памяти, и новые запросы не могут получить необходимое количество памяти для своей работы до тех пор, пока не освободится достаточное количество памяти.

Причины появления «Memory Grants Pending»

  1. Высокая нагрузка на систему: если множество запросов одновременно пытаются использовать память, и общий объем доступной памяти ограничен, некоторые запросы будут ждать, пока не освободится достаточно памяти.
  2. Неправильная настройка памяти: если параметры памяти SQL Server неправильно настроены, например, если установлен слишком низкий лимит памяти (max server memory), это может привести к частому возникновению состояния «Memory Grants Pending».
Отслеживать «Memory Grants Pending» можно с помощью инструмента Perfomance Monitor:

  • Нажмите Perfomance Monitor (1)
  • Нажмите кнопку Add (2)
  • Найдите пункт Memory Manager (3)
  • Выберите из списка Memory Grants Pending (4) и нажмите ОК (5)
Метрика будет отражаться в окне мониторинга:

Использование Hints. Option (Recompile)

Что такое Hints?

Hints (“хинты”) в MS SQL Server используются для предоставления дополнительных инструкций к SQL Server о том, как именно должен быть выполнен запрос. Они позволяют разработчикам и администраторам баз данных тонко настраивать поведение SQL Server, оптимизируя производительность запросов и управляя ресурсами системы.

  • Использование hints должно быть обоснованным: непродуманное использование хинтов может привести к непредвиденным результатам и ухудшению производительности.

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

Option (Recompile)

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

  • Динамические запросы: в случае динамического SQL или запросов, условия которых могут значительно варьироваться, OPTION (RECOMPILE) может помочь обеспечить оптимальное использование памяти.

  • Работа с большими объемами данных: когда запросы обрабатывают большие объёмы данных, и статистика может меняться быстро, использование OPTION (RECOMPILE) может помочь избежать нежелательных эффектов от использования устаревшей статистики.

Option (Recompile) можно указать при создании процедуры:
Так же, хинт можно использовать при вызове процедуры:
При использовании Option (Recompile) использование памяти может быть улучшено до 20 раз.

Результат выполнения комплексного запроса с Recompile и без:
Как мы видим, использование Option (Recompile) смогло улучшить использование памяти практически в 10 раз.