Настроить:
- Windows Server 2008 R2
- SQL Server 2008 R2 с пакетом обновления 1
- 240 ГБ ОЗУ
- TempDB - это файлы данных 8x16 ГБ без автоматического увеличения (всего 128 ГБ)
- Физический / Автономный Сервер
Этот сервер используется для обработки ETL. Мы только что установили больше оперативной памяти на этом сервере в общей сложности 240 ГБ ОЗУ. Службы SQL Server - единственные действующие вещи.
Память хорошо отображается в BIOS, OpenManage и Windows.
Если я настрою SQL Server на использование минимального / максимального объема памяти 70/100 ГБ, у нас не возникнет проблем. Однако, когда я увеличиваю это значение до 120/150 ГБ, я получаю следующую ошибку при запуске одного из наших процессов ETL:
Не удалось выделить место для объекта «<временный системный объект: 422234507706368>» в базе данных «tempdb», поскольку файловая группа «PRIMARY» заполнена. Создайте дисковое пространство, удаляя ненужные файлы, удаляя объекты в файловой группе, добавляя дополнительные файлы в файловую группу или устанавливая автоматический рост для существующих файлов в файловой группе. (Сообщение 1105, состояние 2, процедура неизвестна, строка 1)
Мы никогда не сталкивались с этой проблемой до изменения конфигурации памяти. После перенастройки обратно на исходные 70 / 100ГБ мы не получаем эту ошибку.
Вещи, которые я пробовал:
- Установите файлы данных TempDB для автоматического увеличения. Это просто приводит к автоматическому росту файлов до тех пор, пока не будет достигнута емкость диска, а затем происходит сбой.
- Добавьте больше файлов данных TempDB. Та же ошибка, что и на рисунке.
- Увеличьте размер TempDB до 8x32 ГБ (всего 256 ГБ)
Я в недоумении относительно того, что может быть причиной этой проблемы.
источник
Ответы:
Спасибо всем за вашу помощь.
После пролистывания некоторых планов выполнения выясняется, что существует JOIN, который обрабатывается по-разному в зависимости от объема доступной оперативной памяти. С меньшим количеством оперативной памяти он оценивает его с помощью хэша; с большей оперативной памятью используется серия Merge Joins.
Так что в основном все сводилось к плохо написанному T-SQL, который я в настоящее время занимаюсь рефакторингом.
источник
Это не ответ на вопрос, просто код, который я не хотел публиковать в комментарии. Чтобы увидеть баланс ваших планировщиков и памяти между узлами NUMA (а также увидеть, не видны ли какие-либо узлы в сети):
(В SQL Server 2012 последнее
SUM
должно быть последним,SUM(pages_kb)
поскольку больше нет отдельных одно- и многостраничных распределителей.)источник