Уничтожение временных таблиц в пакете запросов #722789


#0 by sereban
Часто приходится писать пакетные запросы с большим количеством временных таблиц (доходит до 100). В основном для отчетов на скд. В результате получается очень большой список на закладке "Пакет запросов" конструктора. Большую часть временных таблиц (за исключением таблиц, участвующих в последнем результирующем запросе) необходимо уничтожать после выполнения последнего запроса, в котором она использовалась. Собственно вопрос: кто-нибудь пытался автоматизировать эту задачу? Необходимо в пакетном запросе прописать уничтожение ВТ после ее последнего использования. Понятно, что задача не сложная, можно разбить текст по запросам опираясь на ";" и найти имена временных таблиц по "поместить", но может есть что-нибудь готовое?
#1 by vde69
можно не уничтожать, система сама уничтожает...
#2 by SeiOkami
, ходят слухи, что ручное уничтожение не требуется. Но никто точно сказать не может. Точнее споров много.
#3 by Ненавижу 1С
а если транзакция оборвется, ВТ уничтожится?
#4 by VladZ
"Часто приходится писать пакетные запросы с большим количеством временных таблиц (доходит до 100)."  Есть подозрение, что что-то не так со структурой данных.
#5 by SeiOkami
А вообще, 1С могла бы в конструкторе сделать галочку "автоматическое удаление временной таблицы", дабы 1Ска сама это делала
#6 by H A D G E H O G s
Уничтожать имеет смысл при неоднократном использовании тех же имен ВТ в рамках одного менеджера ВТ, и никак иначе.
#7 by H A D G E H O G s
Уничтожится, не боись.
#8 by SeiOkami
* 1С могли бы
#9 by sereban
В какой момент система уничтожает? Временные таблицы в моем случае находятся в TempDB на SQL. TempDB расположен на рамдиске (диск в оперативке) и место на под TempDB ограничено. Вот если бы наверняка знать, что таблица будет уничтожена после ее последнего использования, а не после выполнения всего пакета, то вопросов бы не возникало
#10 by sereban
Что-то не так со структурой мозгов у руководства, которое требует такие отчеты)
#11 by Kamas
Используй вложенные запросы)))
#12 by John83
зачем же это реализовали?
#13 by H A D G E H O G s
Вероятность 100 раз создавать многомегабайтные таблицы КРАЙНЕ МАЛА, либо ты хреновый программист.
#14 by SeiOkami
, ага, убей SQL, дабы сохранить место для ВТ )
#15 by vde69
в момент разрушения менеджера временных таблиц, для скд - это окончание вывода данных, для простого запроса - это разрушение переменной "запрос"
#16 by vde69
дилема ВТ/Вложенный не такая простая, иногда лучше юзать ВТ иногда вложеные запросы. мое мение - ВТ нужны при повторном использовании результата или принудительном индексирование результата, все остальные случаи вполне обходятся вложеными запросами.
#17 by SeiOkami
, так всё же. Когда очищаются ВТ ? Мне тоже интересно
#18 by Kamas
Когда запрос отработает
#19 by SeiOkami
, составители рекомендаций от 1С с тобой не согласны
#20 by SeiOkami
, то есть, если я грохну переменную "Запрос", то сразу грохнуться и все ВТ этого запроса?
#21 by vde69
+ на самом деле за разрушение ВТ отвечает сборщик мусора... и именно по этому всякие незакрытые транзакции, блокировки и т.д не мешают их очищать...
#22 by Kamas
Здесь вопрос что вам нужно Мало опреративы или мало обращений к sql
#23 by vde69
да у каждого свое мнение к читабельности кода, собственно я пробовал мерить производительность и понял, что разнице нет.
#24 by H A D G E H O G s
Нет. Все не так. В 8.2 когда грохается Запрос, МенеджерВТ, СКД - ВТ очищаются, но остаются жить как пустые объекты пока жив сеанс пользователя sql. (пока сервер 1С подключен к SQL). В 8.3 ВТ очищаются и удаляются.
#25 by Kamas
маленький секрет если вы грохните до выполнение то их еще не будет если после, то их уже не будет, а вовремя выполнения вы его грохнуть не сможете.
#26 by H A D G E H O G s
"или принудительном индексирование результата" Необходимость индексирования ВТ КРАЙНЕ мала и редко необходима.
#27 by SeiOkami
, а чем череваты пустые объекты ВТ? То есть можно не париться и не грохать постоянно в самих запросах ВТ?
#28 by SeiOkami
, а как же тогда УНИЧТОЖИТЬ в тексте запроса? Когда он срабатывает?
#29 by H A D G E H O G s
Можно не парится, пока не начнешь использовать один и тот же менеджер ВТ; пока не прилетит ошибка вида "Данная временная таблица уже существует"
#30 by SeiOkami
, интересно. Просто у нас есть утверждающие, мол ВТ нужно удалять всегда после последнего обращения. Мол так намного быстрее, лучше и вообще труЪ
#31 by Escander
таки утверждаешь, что темпдб будет безразмерен если аптайм кластера серверов 8.2 долог?
#32 by SeiOkami
, а потом запросы открываешь, где половина пакетов - удаление результатов других пакетов
#33 by AlexITGround
а как же "хочу именно вот таким образом", а то ж если вложенными делать, то в итоге с оптимизацией СУБД может получиться совсем другой запрос?
#34 by Kamas
в тексте запроса э то в тексте запроса вы говорили
#35 by vde69
это хоороший стиль, суть такого подхода - не зависить от косяков будующих релизов платформы. но тут нужно знать во всем меру, по тому как если у меня 200 таблиц и пытатся их все закрыть в том-же запросе - читабельность упадет ниже плинтуса...
#36 by H A D G E H O G s
Если у тебя 100 ВТ размером по 10 мегабайт каждая - они заставят распухнуть tempdb очень быстро, если их в пакете сразу же не удалять. Но 100 ВТ размером по 10 мегабайт - это лютый пздц.
#37 by SeiOkami
, понял. То бишь в случаях больших объёмов лучше сразу удалить, чем тянуть до последнего
#38 by SeiOkami
, ну даже не знаю. Как "стиль" уже очень раздражает.
#39 by H A D G E H O G s
Я забиваю на такую фигню. tempdb шринкуется ночью.
#40 by ultrannge89
Предположу что наверное сам запрос не очень оптимизирован, если почитать последнюю моя тему, там я тоже вначале делал 8вт, а к концу концу уже 4...
#41 by vde69
из личного опыта, база 30 гигов, темДБ примерно 150 гигов.... После оптимизации стало примерно 30... да и скорость увеличилась...
#42 by H A D G E H O G s
150 гигов - за день???!!!
#43 by Necessitudo
Ну я смотрел профайлер и там видно, что после каждого запроса с использование ВТ 1С-ка добавляет в конце запроса "truncate" на эту временную таблицу. То есть таблица очищается, а потом запихивается  в tempdb для последующего использования.
#44 by H A D G E H O G s
"а потом запихивается  в tempdb для последующего использования" Че?
#45 by vde69
это размер файла темп-дб после суток работы, шринк каждую ночь... а на этом серваке таких баз было 4, тестовая, распределенка и для разработки, терабайтного диска не хватало под четыре 30 гиговые базы, руководству это было обьяснить тяжеловато :)
#46 by Drac0
Пожалей оптимизатор скуля. План для вложенных запросов сильно зависят от текущей статистики, нагрузки, расположения звезд. Сейчас может построиться мега-оптимальный план, а через 5 минут наоборот. ВТ в этом плане намного стабильнее.
#47 by rsv
Ничего что  движок 1С полностью  заточен под ВТ ? Можно гирлянду складывать .. начинается #t1..... #t23  и так далее
#48 by rsv
Любая  движковая виртуальная талица ...  провести ... записать... - это временные таблицы и temp
#49 by ultrannge89
У меня у одного глаза на лоб лезут когда начинаешь разбираться в чужом вложенном запросе... Даже ради того чтобы потом легко было вкурить, можно пожертвовать 2-3 сек спорного быстродействия и писать с ВТ.
#50 by Necessitudo
Что слышал. Транкейт это не дроп.
#51 by H A D G E H O G s
Я понимаю, что такое дроп и транкейт. Я не понимаю порядок мыслей в твоем предложении.
#52 by Necessitudo
Ну на создание временной таблицы тратится время. Видимо быстрее положить пустую таблицу в tempdb, чтобы потом при надобности не создавать новую, а использовать существующую.
#53 by Ник второй
Ты в крайней степени не прав.
#54 by Ник второй
Нет не так. ВТ грохнется еще до того, как ты рохнешь Запрос, а именно в момент выполнения запроса "Выполнить". Если конечно не оставляем в живых МВТ
#55 by Necessitudo
Иногда запрос настолько длинный, что для сокращения тупо проще использовать вложенный запрос.
#56 by Ник второй
Сборщик мусора тут не причем.
#57 by Ник второй
Запрос нужно писать, что бы он выдавал прогнозируемый результат за прогнозируемое время, а не по количеству строк.
#58 by Necessitudo
Если потом с тебя потребуют его быстро переписать, то какая-то оптимальность становится не так уж и важной)
#59 by Sammo
Если мне не изменяет мой склероз, то был баг платформы, правда скорее всего еще в 8.1, когда временные таблицы не удалялись если в явном виде не указать уничтожить или не зачистить менеджер. Исходя из этого я всегда стараюсь за собой подчищать. Часто видел, когда некоторый прирост проивзодительности давал просто переход на временные таблицы и отказ от вложенных запросов. Причина - несмотря на то, что временные таблицы писались в темпдб план запроса становился более прогнозируемым и оптимальным.
#60 by Kamas
да а в процессе переписывания вдруг неожиданно нужно сделать левое соединение 1 вложенного с предпоследним
#61 by Kamas
в 8.1 было
#62 by Ник второй
Переписать запрос с временными запросами проще. Но опять же повторюсь, что при написании запроса на в первую очередь упирать на предсказуемость результат и скорости выполнения.
#63 by Necessitudo
Лишь бы работало - а уж после жалоб пользователей можно и оптимизировать. Знаю, звучит дико - но деваться некуда, план же требуют)
#64 by Sammo
И вот здесь, имхо, у временных таблиц более предсказуемые параметры - скуль будет формировать план более предсказумео (из-за того, что запрос разбит на более простые части)
#65 by Ник второй
План посылается далеко и надолго. На самом деле рекомендаций по написанию запросов не много и можно их следовать на автомате.
#66 by Ник второй
Именно, поэтому временные таблицы в большинстве случаев являются наиболее предпочтительным вариантом.
#67 by vde69
еще ВТ имеет смысл при программном формировании текста запроса. это куда более понятно и каждую ВТ по отдельности можно открыть конструктором.
#68 by Dzenn
Упрощай и оптимизируй способы решения задач, тогда не придётся оперировать десятками временных таблиц.
#69 by Dzenn
А по сути вопроса - ВТ уничтожаются автоматически, и уничтожать их вручную требуется в очень редких случаях.
#70 by vogenut
О боже, какая каша в головах...
#71 by vogenut
По теме, удалять желательно после последнего использования: - Таблица может быть переиспользована далее. - Уменьшается нагрузка на tempdb в смысле объема инфы содержащейся в данный момент
#72 by John83
кстати, в типовых ВТ уничтожаются крайне редко..
#73 by TormozIT
Да, если нет уверенности, что размер временной таблицы будет не гигантским, то лучше ее удалять поскорее. В остальных случаях не вижу смысла.
#74 by sereban
Собственно вопрос стоял по автоматизации вставки в текст запроса строк: УНИЧТОЖИТЬ <ИмяВТ> в нужных местах
#75 by Йохохо
Для Каждого Стр ИЗ СтрВТ КонецЦикла; 100500 на телефон, - 500 за каждую ошибку
#76 by Надо работать
за такой код ты платить должен. кровью!
#77 by Ник второй
Как выяснили, что это не нужно.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С