Skip to content

Запрос существенно замедлился с появлением операции Table Spool (Lazy Spool) в плане его выполнения?

Совсем недавно в одной из наших заказных систем (платформа – 1С 8.2 управляемое приложение) существенно увеличилось время формирования отчетов. Те, что раньше строились за 1-2 минуты стали замирать на 10 минут. Оказалось, что причиной существенного замедления отчетов, стало появление физической операции Table Spool в запросах формирующих выборку необходимой информации для ее последующего вывода в отчетах.

Проблема.

Время на формирование нескольких ключевых отчетов увеличилось с нескольких минут до 10. Диагностика показала, что дольше стали выполняться запросы. Анализ планов запросов показал, что причиной деградации является физическая операция Table Spool.

Описание Table Spool на technet – http://technet.microsoft.com/ru-ru/library/ms181032(v=sql.105).aspx

Решение.

При помощи SQL Profiler были собраны планы выполнения запросов, использующихся отчетами для получения необходимой информации. Анализ трассировок выявил наличие долго выполняющихся запросов (текст одного из таких запросов на языке T-SQL):

План запроса в котором временная таблица #tt36 размером в 5666 (смотрим колонку «Rows») трансформируется оператором Table Spool в таблицу из 230 миллионов строк:

В графическом виде эта ситуация выглядит следующим образом:

Логической операции Lazy Spool (в текстовом плане запроса отображается как физическая операция Table Spool) на вход подается таблица из 5666 строк (см. колонку «Фактическое количество строк» в таблице №1 рисунка). Lazy Spool трансформирует ее в таблицу из 230 084 928 строк (см. колонку «Фактическое количество строк» в таблице №2 рисунка) и передает в руки Nested Loops, который в свою очередь ожидает получить таблицу совершенно других размеров, а именно таблицу из 5666 строк (см. колонку «Предполагаемое количество строк» в таблице №2 рисунка).
Данная ситуация приводит к существенному снижению скорости выполнения запроса. Текст проблемного запроса на языке запросов 1С выглядит следующим образом:

В нашем случае выборка «облюбованная» Table Spool используется для фильтрации записей табличной части «Аналитика затраты» документа «Версия записи РЗ». Исходя из условий использования этой информации, логично предположить, что таким образом (при помощи трансформации) оптимизатор пытается ускорить процесс фильтрации, но ошибается. Со своей стороны мы можем помочь ему в этом деле, например, избрав наименее трудоемкий способ – вместо выборки из временной таблицы «втНСИ» используем для фильтрации выборку из одноименного индекса (во временной таблице), построенного по колонке «СсылкаКБП_УИД»:

При попытке построить такой индекс получаем «нагоняй» от платформы. В результате последующего анализа архитектуры выясняем, что значения в колонке «СсылкаКБП_УИД» временной таблицы могут быть двух типов (в терминологии 1С – «составной тип»): «Строка – максимальная длина 150 символов» или «Число – максимальная разрядность 15 знаков»:

Колонка «УИД» табличной части «Аналитика затраты» документа «Версия записи РЗ» содержит данные типа «Строка – максимальная длина 50 символов»:

Вывод очевиден. Использовать значения колонки составного типа (колонка «СсылкаКБП_УИД» временной таблицы) для фильтрации данных в таблице с колонкой («УИД»), содержащей значения типа «Строка – максимальная длина 50 символов» (колонка «УИД» табличной части «Аналитика Затраты» документа «Версия записи РЗ») не оптимально. Перед использованием выборки из временной таблицы, необходимо привести значения колонки «СсылкаКБП_УИД» к типу «Строка – максимальная длина 50 символов»:

После приведения значений в колонке «СсылкаКБП_УИД» к типу совпадающему с типом значений в колонке «УИД» табличной части «Аналитика затраты» документа «Версия записи РЗ» при выполнении запроса СУБД перестала модифицировать выборку средствами выполнения операции Table Spool и производительность запросов вновь стала соответствовать норме.

Выводы.

Если внезапно снизилась скорость выполнения запросов и источником замедления является физическая операция Table Spool, обратите особое внимание на архитектуру таблиц перерабатываемых этой операцией.

Be First to Comment

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *