Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

Вопрос по оптимизации БД

#sql #sql_server


Задали вопрос на собеседовании по sql:

Система успешно работала полгода, затем неожиданно производительность серьезно деградировала.
Возможные проблемы, пути решения?

Как можно было ответить?
    


Ответы

Ответ 1



Если объем данных не рос, и приложение не менялось: Посмотреть на настройки памяти - вдруг что-то выдавливает SQL Server (A significant part of SQL Server process memory has been paged out в логах). Или просто памяти не хватает. Посмотреть фрагментацию индексов и актуальность статистики. Хороший DBA должен был прикрутить автодефраг и обновление как часть обслуживания, если не прикрутил - взять с https://ola.hallengren.com/, или хотя бы настроить maintenance plan. Посмотреть на стандартные ошибки настроек Recovery Mode (Full без бэкапа логов, Full с бэкапом логов и слишком актвным шринком). Если объем данных рос, или менялось приложение: Посмотреть медленные/дорогие/regressed запросы через Qurery Store (если доступен и включен). Или хотя бы sys.dm_exec_query_stats. Если есть явные проблемные запросы - чинить их. Если нет - обновить статистику / дефрагментировать индексы, и начинать чинить/переписывать запросы, начиная с тех, которые вам больше всего не нравятся. В качестве более подробного чеклиста: MSDN, Checklist for Analyzing Slow-Running Queries Чего точно делать нельзя: Нельзя делать хоть что-то, если до конца не понимаешь возможные последствия. Нельзя пересчитывать статистику не зная, что это такое. И нельзя добавлять индексы, не понимая как они работают внутри. В том числе - нельзя использовать ответы на SO в качестве замены собственного понимания истоков проблемы :) Нельзя создавать индексы наугад, не измеряя разницу на конкретных запросах. Нельзя чинить проблемы краткосрочными костылями. Т.е. если пересчет статистики помог - его надо включить в maintenance plan, а не просто оставить как есть до следующего раза.

Ответ 2



Собственно, начать нужно с изучения проблемы. Какие именно запросы стали выполняться дольше? Если часть -- надо проанализировать, что делает запрос -- чтение, поиск, сортировку, запись и обновление, или удаление. Если все -- надо посмотреть, не забит ли диск, не увеличилось ли резко число данных в таблице, и т.п. И уже исходя из этого смотреть в сторону индексов, лишних данных, железа, и т.п.

Комментариев нет:

Отправить комментарий