Базовый анализ проблем на сервере СУБД. Часть 2. Логические проблемы
Базовый анализ проблем на сервере СУБД. Часть 2. Логические проблемы
В предыдущей публикации мы подняли тему того, как «ДБ-сервис» диагностирует неполадки после получения жалоб от клиентов. А также рассмотрели первую большую группу возможных аварий — инфраструктурные проблемы.
Сегодня мы поговорим о второй группе, в которую входят логические проблемы, относящиеся к внутренней работе СУБД. Хотя часть из них может вызываться неисправностями в работе физического оборудования, решение именно логических проблем находится в компетенции наших инженеров.
Блокировки
При выполнении транзакций СУБД накладывают на данные блокировки — временные ограничения на выполнение некоторых операций обработки данных, такие как чтение и запись. Это позволяет выстраивать в очередь все транзакции, работающие с конкретной строкой в базе и помогает защищать целостность данных.
SQL-блокировки — важный механизм работы СУБД, однако нередки случаи, когда неоптимальное пересечение процессов влечет за собой появление разных проблем одновременного доступа к данным. В таких ситуациях самое главное — найти корень проблемы.
Как видно из этого скриншота, команда на обновление полумиллиона строк под spid 301, запущенная пользователем, ожидаемо заблокировала таблицу и ряд других обновлений выстроились в очередь.
Анализ типов ожиданий и ресурсов позволяет проанализировать ситуацию и решить, что с ней делать. Если блокировок много и виновник не очевиден или их несколько, нужно построить «дерево блокировок» и станет точно ясно, кто является «корнем».
Пример отсутствия блокировок и нормального выполнения всех запросов можно увидеть на скриншоте ниже.
Неоптимальное состояние таблиц, которые участвуют в запросах
Следующий важный аспект логических проблем, затрудняющих нормальную работу БД — неоптимальное состояние таблиц. Речь в первую очередь идет о фрагментации индексов и таблиц (если они без кластерного индекса) и актуальности статистики по ним.
Если индекс сильно фрагментирован (более 50%, а то и более 90%), его чтение увеличивает число процессорных тактов необходимых для выполнения запроса по сравнению с дефрагментированным индексом (менее 10%).
Неактуальная же статистика может вести к выбору неоптимального плана запроса, который невозможно завершить с нужной скоростью.
В «ДБ-сервис» для анализа статистики мы используем собственные скрипты, позволяющие получать наиболее точные данные.
Как видно из скриншота, индексы не фрагментированы, однако, даже если бы картина была обратной, их размеры (менее 5 ГБ) позволили бы без проблем запустить скрипт для ребилда:
update statistics inventdim with maxdop = 32, sample 25 percent
В рассматриваемом примере статистика по таблице обновляется с выборкой 25% - для выбора такого значения параметра нужно точно знать, что таблица невелика. Также здесь используется многопоточный режим, который доступен для SQL SERVER, начиная с версии 2014 SP3.
Важно понимать что во время проведения диагностики и других работ не должно выполняться мешающих им процессов. Иначе, даже производя банальное обновление статистики, можно столкнуться с блокировкой, как это видно на скриншоте ниже.
Процесс 3754, выполняющие вставки / апдейты, наложил ни с чем не совместимую монопольную блокировку на таблицу INVENTSUMDELTA. В результате становится невозможным ни обновить статистику, ни перестроить индекс в онлайн т.к. они требуют блокировку уровня схемы.
Помимо явных признаков проблемы со структурой существуют неявные, например когда все показатели в норме, но запрос все равно работает медленно. Обычно это встречается в больших БД и диагностируется открытием свойств таблицы и проверки значения количества фантомных строк. Пример такой ситуации можно увидеть на скриншоте ниже.
В свойствах индекса можно увидеть, что его фрагментация в норме (всего 7,5%), однако число фантомных строк версии превышает 4 миллионов.
Наши инженеры опытным путем вывели, что перестроение такого индекса убирает проблему и скорость выполнения запросов многократно возрастает, однако более профессиональным все же считается выполнение обслуживания проблемной таблицы целиком. Делается это с помощью выполнения следующей команды:
ALTER INDEX или ALTER TABLE
ALTER INDEX ALL ON [dbo].[INVENTSUMDELTA] REBUILD WITH (MAXDOP = 64,SORT_IN_TEMPDB = ON,ONLINE = ON, DATA_COMPRESSION = PAGE)
Отсутствие необходимой структуры данных
Еще один аспект логических проблем в СУБД — отсутствие необходимой структуры данных. Речь может идти об индексах или даже статистике.
В отсутствие подходящего индекса запрос может тратить много времени на сканирование неподходящего. Часто о не хватающем индексе сообщает оптимизатор запросов в верхней части плана запроса.
Отсутствие нужной статистики также не способствует быстрому выполнению запроса. В оптимизаторе запросов лакуны в данных также выводятся в виде предупреждений на определенных участках.
Оптимизатор запросов — это механизм, управляющийся ядром СУБД и транслирующий команды TSQL в план запроса. Сам этот процесс принято называть компиляцией. Компиляция происходит перед каждым выполнением запроса, если его план не был скомпилирован ранее и сохранен в кэше.
Как видно из примера на скриншоте выше, оптимизатор запросов не находит нужный индекс, однако это не означает, что нужно его сразу создавать. Первое, что делается в таких ситуациях — проверяется структура существующих индексов, оценивается размер таблицы, производится попытка выполнить запрос вручную и проанализировать его план. Вполне возможно, что подходящий индекс для этого запроса существует, однако оптимизатор по каким-то причинам его не выбрал.
Проблема внутри логики СУБД
Не всегда план выполнения запроса строится оптимальным образом. Если он уже скомпилирован, то никакие работы ходе выполнения запроса не приведут к ускорению работы системы — все оптимизации будут актуальны лишь для последующих запусков.
Причин проблем с логикой запросов может быть несколько:
Неактуальная статистика. Как следствие — выбирается, например, оператор сканирования индекса вместо оператора поиска или же нарушается оптимальный порядок выбора таблиц при их объединении. В такой ситуации нужно пересчитать статистику по проблемным объектам.
Высокая фрагментация подходящего индекса. Как следствие — оптимизатор может выбрать менее фрагментированный, но и менее подходящий индекс. В этом случае необходимо провести дефрагментацию индекса.
Большой кэш старых планов запросов при условии их вариативности. Как следствие — при параметризированных запросах ранее скомпилированные планы плохо подходят для новых запусков. При подобных проблемах нужно очистить процедурный и сессионный кэш.
Симптомы проблем с логикой SQL внутри СУБД не всегда являются явными. К примеру, если много мелких запросов выполняются не 10 Мс., а 500 МС., разница не будет заметна ни для человеческого глаза, ни для многих диагностических скриптов, однако скорость процесса будет замедлена в 50 раз.
В результате проблема одного пользователя с одним процессом, масштабируясь, может стать критичной для бизнеса, а, следовательно, также нуждается в скорейшем устранении.
В случае, когда надо проанализировать множество мелких запросов, можно настроить сборщик данных по интересующим нас сессиям.
Анализ количества запросов и потребления ресурсов в этом примере не позволяет сделать вывод о наличии проблем. Однако, если бы первый запрос выполнялся 120 раз, он стал бы первым кандидатом на оптимизацию. Если после фрагментации, обновления статистики и повторного запуска процедуры запрос выполнялся бы уже 1000 раз, можно было бы говорить о восьмикратном ускорении в результате устранения неполадок.
Выводы
В этой статье мы рассказали об основных аспектах логических проблем, возникающих на серверах СУБД. Были рассмотрены конфликты блокировок SQL, неоптимальные состояния таблиц, участвующих в запросах, отсутствие необходимой структуры данных и проблемы внутри логики СУБД.
Хотя общее понимание того, как диагностировать такие неполадки может пригодиться каждому системному администратору, еще раз подчеркнем, что базовый анализ и устранение логических проблем на серверах СУБД — зона ответственности «ДБ-сервис». Наши инженеры в любое время суток помогут с сопровождением любой базы данных и всем комплексом работ по их администрированию, чтобы ваш бизнес был надежно защищен от технических неполадок.
Нужна поддержка или планируете изменения в инфраструктуре?
Проблемы с производительностью, переход на PostgreSQL, нестабильная БД — у нас есть опыт, чтобы это исправить. Оставьте заявку — обсудим, чем можем помочь именно вам.
Круглосуточный контроль за состоянием вашей базы данных. Уведомления в случае отклонений, отчёты и превентивные меры. Обеспечиваем стабильность и безопасность.
Логическая структура базы данных - это концептуальный уровень организации данных, определяющий, как информация представлена, связана и обрабатывается внутри системы управления базами данных (СУБД).
Физическая структура базы данных– это нижний уровень организации данных, отражающий, как именно информация хранится на физических носителях, таких как жесткие диски или SSD.
Опыт работы: 9 лет администрирования СУБД MSSQL SERVER
Образование: ЮФУ, Диплом специалиста по специальности «Физика», Диплом магистра по специальности «Прикладная информатика», Диплом о профессиональной переподготовке по специальности «Системный инженер»