Обработка для конвертации текста запроса, построенного на вложенных запросах, в запрос на временных таблицах для 8.2



Столкнулись с редактированием текста запроса под временные таблицы вместо вложенных запросов? Потеряли поля при таком редактировании? Тогда это вам пригодится
После прочтения статьи «ТИПИЧНЫЕ ПРИЧИНЫ НЕОПТИМАЛЬНОЙ РАБОТЫ ЗАПРОСОВ И МЕТОДЫ ОПТИМИЗАЦИИ В 1С » появилось желание оптимизировать многие свои отчеты и запросы, и убрать из них все связи с вложенными запросами, переделав их во временные таблицы. Оказалось что делать это не так просто как на первый взгляд, иногда теряются какие то названия полей и в итоге могут потеряться итоговые поля или условия последнего запроса. Это привело к созданию такой обработки. Из особенностей отмечу автоматическую нумерацию вложенных запросов с названием «Вложенный запрос», а так же правильное установление порядка следования и вложенности вложенных запросов при преобразование в пакетный запрос. Проверял на больших запросах, работает отлично. Сохраняйте старую копию и формируйте по новому и сравнивайте результат. По моему опыту выигрыш в производительности дает значительный при очень больших запросах с большим количеством связей, у меня есть приме когда с 15 минут формирования сократился до 1 минуты. Значительный прирост производительности появился на SQL базах с редко обновляемой или не обновляемой статистикой. Подробнее про это влияние можете прочесть в статье в начале описания.

Теперь о самой обработке, до преобразования необходимо открыть текст запроса конструктором и нажать ОК, делается это для удаления лишних пробелов пустых строк и т.п. что бы конвертеру возможно было распознать конструкции вложенного запроса. Далее все просто скидываем текст наживаем «Преобразовать» и получаем новый текст. Есть еще кнопка «Заменить первый», она заменяет только внешний запрос во временную таблицу и далее не продолжает. 

!Внимание заменяет все вложенные запросы на временные, независимо от того используются они в соединении(или условии) или нет, т.е. для таких вложенных таблиц не происходит оптимизации!

16 Comments

  1. help1Ckr

    Идея хорошая, но можно сделать еще лучше — встроить данный механизм в типовую консоль запросов

    Reply
  2. matveev.andrey.v

    (1) help1Ckr, спасибо за оценку, уже встроил, но выложить тут не смогу поскольку консоль запросов не моя разработка. Могу выслать консоль доработанную вам

    Reply
  3. aspirator23

    (2) И мне можно эту консоль получить? Часто приходится встречать запросы с вложенными подзапросами и переделывать.

    Reply
  4. matveev.andrey.v

    (3) aspirator23, Да конечно, отправил вам в ЛС

    Reply
  5. aspirator23

    (4) matveev.andrey.v, спасибо

    Reply
  6. matveev.andrey.v

    (6) dimas103, Добрый день, судя по наличию комментариев в запросе типа «//ОБЩИЕ_СВОЙСТВА» вы не открыли ее конструктором и не нажали «ок» что бы удалить лишние символы как написано на основной странице обработки. Кроме того я не настраивал конвертер что бы он распознавал фигурный скобки {} которые используются в построителе запросов. Если еще кому то понадобится напишите сюда сообщение, пару человек наберется, допилю

    Reply
  7. dimas103
    Reply
  8. matveev.andrey.v

    (8) dimas103, Видишь ли если запрос формируется динамически то тебе будет сложно его преобразовать конверетром во временные таблицы, т.к. там после конвертирования его опять придется по кускам разбивать, по моему уже проще самому переделать. Фигурные скобки попробую доделать только честно говоря никогда ими не пользовался, придется попарится.

    Reply
  9. dimas103

    (7) matveev.andrey.v, Да точно, лишнее не по убирал. Сначала статью прочитал потом через пару дней попробовать решил. Не получилось, сразу отписал. Если не сложно то добавь фигурные скобки. И хорошо бы еще Комменты. Вот в стандартной конфе написан такой запрос. При чем он формируется динамически в зависимости от настроек. Хотел твоей обработкой на лету его видоизменять. А этого нет. Вообще хорошая бы вещь получилась. Потому что часто пишут про оптимизацию запросов но в старых базах проще твоей обработкой изменить запрос чем перпеписывать логику запроса заново.

    Reply
  10. dimas103

    (9) matveev.andrey.v, Так втом то и идея что полностью готовый отчет сфоримрованный системой с условиями. Уже через твою обработку преобразовывать в запрос со временными таблицами и запускать дальше на выполнение.

    Reply
  11. matveev.andrey.v

    (10) dimas103, АААА тогда понятно но это нереализуемо, собрать текст запроса можно только при компиляции

    Reply
  12. matveev.andrey.v

    (10) dimas103, Сегодня еще раз подумал над вашим предложением и наконец понял, что вы имеете ввиду, зашить обработку в процедуру, которая при компиляции будет преобразовывать сформированный текст запроса. Идея отличная, спасибо! Вы кстати можете ее сами реализовать, поскольку текст обработки открытый, а такое будет совсем несложно сделать. Если мне когда нибудь понадобится такое, обязательно сделаю и выложу сюда код

    Reply
  13. aspirator23
    Reply
  14. matveev.andrey.v

    (13) aspirator23, Добрый день. Да вижу что сконвертировался неправильно. К сожалению у меня нет этой конфигурации что бы протестировать с конструктором, vогли бы вы выслать dt

    Reply
  15. aspirator23

    (14) matveev.andrey.v, С Dt-файлом сложновато. Выслал сам отчет Торг29 и cf-файл в личную и здесь прикрепил отчет.

    Возможно причина в том что там сложная вложенность запросов.

    Reply
  16. roschupkin_e

    можно еще добавить логику ухода от дублирования названий ВТ.

    Тестовый запрос с одинаковыми названиями уже не разбирает правильно.

    ВЫБРАТЬ
    ВложенныйЗапрос2.Ссылка,
    ВложенныйЗапрос2.Код,
    ВложенныйЗапрос2.Наименование
    ИЗ
    (ВЫБРАТЬ
    ВложенныйЗапрос2.Ссылка КАК Ссылка,
    ВложенныйЗапрос2.Код КАК Код,
    ВложенныйЗапрос2.Наименование КАК Наименование
    ИЗ
    (ВЫБРАТЬ
    Контрагенты.Ссылка КАК Ссылка,
    Контрагенты.Код КАК Код,
    Контрагенты.Наименование КАК Наименование
    ИЗ
    Справочник.Контрагенты КАК Контрагенты) КАК ВложенныйЗапрос2) КАК ВложенныйЗапрос2

    Показать

    Reply

Leave a Comment

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