SQL Server переоценивает план выполнения, выделяет ГБ ОЗУ, но запрос фактически использует только МБ - PullRequest
2 голосов
/ 09 мая 2019

Мы управляем почти дюжиной экземпляров SQL Server 2016 Enterprise, и это происходит во всех из них: завышение требуемой памяти для запросов. Реальная переоценка на уровне ГБ.

Большинство серверов имеют 512 или 256 ГБ ОЗУ, поэтому, насколько я знаю, SQL Server специально использует 75% своей выделенной памяти для запросов (память рабочей области), и из этих 75% может занимать до 25%. максимально предоставленная память для каждого запроса. Что ж, это приводит нас к запросам - плохие запросы, о которых я знаю (несколько объединений, сортировок и просмотров после представлений и с затратами на запросы в тысячах), иногда получающие ~ 45 ГБ ОЗУ (~ 25% из 75%).

Проблема, как вы можете видеть из изображения ниже, следующая:

enter image description here

И запрашиваемая, и предоставленная память намного превосходят требуемую и специально используемую память.

Я уже пробовал это, но безрезультатно:

  • очистка кэша плана выполнения
  • принудительное обновление статистики для таблиц
  • вручную указав перекомпиляцию по этим запросам
  • различные настройки MAXDOP (это влияло только на «требуемую» память, а не на «запрошенную / предоставленную»)

Таким образом, из того, как работает SQL Server, требуется всего 5-6 с плохо оцененными запрошенными транзакциями памяти (например, 45 ГБ каждая), чтобы перевести все остальные оставшиеся запросы в очередь ожидания RESOURCE_SEMAPHORE (поскольку SQL Server считает ' запрошенная «память, а не« необходимая »память при помещении сеанса в семафор ресурса».

Есть ли у вас какие-либо идеи или предложения?

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