Задний план
Я нахожусь в процессе миграции базы данных 160 ГБ из MSSQL 2008 (стандарт) на сервер Win 2008 с 48 ГБ ОЗУ на новый сервер под управлением MSSQL 2012 (64-разрядная веб-версия) на Win 2012 с 64 ГБ ОЗУ. Старый сервер работает и загружен; новый сервер не работает Новый сервер имеет 8 файлов tempdb (по 4 ГБ каждый).
проблема
При тестировании на новом сервере я вижу, что шаги в многочисленных запросах вызывают оповещения с упоминанием «оператор использовал базу данных tempdb для разлива данных во время выполнения». Мне удалось избежать сортировки, переписав некоторые запросы, но это не решает проблему. Те же самые запросы на старом сервере не вызывают разливов. Я читал, что разливы случаются, когда MSSQL не может завершить операцию в памяти и должен пролить / страницу в tempdb. Должен ли я беспокоиться о разливах?
Примеры
Я запустил sp_updatestats в базе данных, поэтому статистика должна быть актуальной, но вы заметите, что есть некоторые расхождения между предполагаемым и фактическим количеством строк.
Проблема памяти
Я установил максимальный параметр памяти для MSSQL 58 из 64 ГБ. В настоящее время MSSQL использует около 35 ГБ этой памяти, но имеет рабочий набор всего 682 МБ. На старом сервере (хотя и на производстве, для обработки нагрузки) выделено 44 ГБ памяти, выделенной для MSSQL, из которых 43,5 ГБ находятся в рабочем наборе.
Я не знаю, могут ли разливы быть связаны с настройкой памяти - у кого-нибудь есть идеи? У MSSQL в настоящее время есть свободные места в ОЗУ, так почему же он переходит в базу данных tempdb для некоторых сортировок и хеш-совпадений?
источник
Ответы:
Здесь есть несколько разных вопросов:
В: Почему раньше не было запросов?
Они были, но SQL Server Management Studio не воспринимал это как явную ошибку до SQL 2012. Это прекрасный пример того, почему, когда вы настраиваете производительность, вам нужно идти глубже, чем в графическом плане выполнения.
В: Почему запросы выливаются на диск?
Потому что SQL Server не предоставил им достаточно памяти для завершения их операций. Возможно, план выполнения недооценил объем требуемой памяти, или, возможно, окно находится под давлением памяти, или это просто большие запросы. (Помните, что SQL Server использует память для трех целей - кэширования страниц с необработанными данными, кэширования планов выполнения и рабочей области для запросов. Эта рабочая область в итоге оказывается довольно маленькой.)
В: Как я могу уменьшить разливы?
Путем написания изящных операторов T-SQL, наличия современной статистики, размещения достаточного количества памяти на сервере, построения правильных индексов и интерпретации планов выполнения, когда все работает не так, как вы ожидали. Посмотрите книгу Гранта Фричи по настройке производительности SQL Server для подробных объяснений.
источник