Имя: Пароль:
1C
1С v8
Уничтожение временных таблиц в пакете запросов
,
0 sereban
 
13.10.14
14:03
Часто приходится писать пакетные запросы с большим количеством временных таблиц (доходит до 100). В основном для отчетов на скд. В результате получается очень большой список на закладке "Пакет запросов" конструктора. Большую часть временных таблиц (за исключением таблиц, участвующих в последнем результирующем запросе) необходимо уничтожать после выполнения последнего запроса, в котором она использовалась. Собственно вопрос: кто-нибудь пытался автоматизировать эту задачу? Необходимо в пакетном запросе прописать уничтожение ВТ после ее последнего использования. Понятно, что задача не сложная, можно разбить текст по запросам опираясь на ";" и найти имена временных таблиц по "поместить", но может есть что-нибудь готовое?
1 vde69
 
13.10.14
14:04
можно не уничтожать, система сама уничтожает...
2 SeiOkami
 
13.10.14
14:07
(0), ходят слухи, что ручное уничтожение не требуется. Но никто точно сказать не может. Точнее споров много.
3 Ненавижу 1С
 
гуру
13.10.14
14:08
а если транзакция оборвется, ВТ уничтожится?
4 VladZ
 
13.10.14
14:08
(0) "Часто приходится писать пакетные запросы с большим количеством временных таблиц (доходит до 100)."  Есть подозрение, что что-то не так со структурой данных.
5 SeiOkami
 
13.10.14
14:08
А вообще, 1С могла бы в конструкторе сделать галочку "автоматическое удаление временной таблицы", дабы 1Ска сама это делала
6 H A D G E H O G s
 
13.10.14
14:08
(0) Уничтожать имеет смысл при неоднократном использовании тех же имен ВТ в рамках одного менеджера ВТ, и никак иначе.
7 H A D G E H O G s
 
13.10.14
14:09
(3) Уничтожится, не боись.
8 SeiOkami
 
13.10.14
14:09
* 1С могли бы
9 sereban
 
13.10.14
14:10
(1) В какой момент система уничтожает? Временные таблицы в моем случае находятся в TempDB на SQL. TempDB расположен на рамдиске (диск в оперативке) и место на под TempDB ограничено. Вот если бы наверняка знать, что таблица будет уничтожена после ее последнего использования, а не после выполнения всего пакета, то вопросов бы не возникало
10 sereban
 
13.10.14
14:12
(4) Что-то не так со структурой мозгов у руководства, которое требует такие отчеты)
11 Kamas
 
13.10.14
14:15
(9) Используй вложенные запросы)))
12 John83
 
13.10.14
14:16
(1) зачем же это реализовали?
13 H A D G E H O G s
 
13.10.14
14:17
(9) Вероятность 100 раз создавать многомегабайтные таблицы КРАЙНЕ МАЛА, либо ты хреновый программист.
14 SeiOkami
 
13.10.14
14:17
(11), ага, убей SQL, дабы сохранить место для ВТ )
15 vde69
 
13.10.14
14:17
(9) в момент разрушения менеджера временных таблиц, для скд - это окончание вывода данных, для простого запроса - это разрушение переменной "запрос"
16 vde69
 
13.10.14
14:19
(14) дилема ВТ/Вложенный не такая простая, иногда лучше юзать ВТ иногда вложеные запросы.

мое мение - ВТ нужны при повторном использовании результата или принудительном индексирование результата, все остальные случаи вполне обходятся вложеными запросами.
17 SeiOkami
 
13.10.14
14:19
(13), так всё же. Когда очищаются ВТ ? Мне тоже интересно
18 Kamas
 
13.10.14
14:20
(17) Когда запрос отработает
19 SeiOkami
 
13.10.14
14:20
(16), составители рекомендаций от 1С с тобой не согласны
20 SeiOkami
 
13.10.14
14:21
(18), (15) то есть, если я грохну переменную "Запрос", то сразу грохнуться и все ВТ этого запроса?
21 vde69
 
13.10.14
14:21
(15)+ на самом деле за разрушение ВТ отвечает сборщик мусора... и именно по этому всякие незакрытые транзакции, блокировки и т.д не мешают их очищать...
22 Kamas
 
13.10.14
14:22
(14) Здесь вопрос что вам нужно Мало опреративы или мало обращений к sql
23 vde69
 
13.10.14
14:23
(20) да
(19) у каждого свое мнение к читабельности кода, собственно я пробовал мерить производительность и понял, что разнице нет.
24 H A D G E H O G s
 
13.10.14
14:23
(20) Нет. Все не так.

В 8.2 когда грохается Запрос, МенеджерВТ, СКД - ВТ очищаются, но остаются жить как пустые объекты пока жив сеанс пользователя sql. (пока сервер 1С подключен к SQL).

В 8.3 ВТ очищаются и удаляются.
25 Kamas
 
13.10.14
14:24
(20) маленький секрет если вы грохните до выполнение то их еще не будет если после, то их уже не будет, а вовремя выполнения вы его грохнуть не сможете.
26 H A D G E H O G s
 
13.10.14
14:24
(16) "или принудительном индексирование результата"

Необходимость индексирования ВТ КРАЙНЕ мала и редко необходима.
27 SeiOkami
 
13.10.14
14:26
(24), а чем череваты пустые объекты ВТ?
То есть можно не париться и не грохать постоянно в самих запросах ВТ?
28 SeiOkami
 
13.10.14
14:27
(25), а как же тогда УНИЧТОЖИТЬ в тексте запроса? Когда он срабатывает?
29 H A D G E H O G s
 
13.10.14
14:27
(27) Можно не парится, пока не начнешь использовать один и тот же менеджер ВТ; пока не прилетит ошибка вида "Данная временная таблица уже существует"
30 SeiOkami
 
13.10.14
14:29
(29), интересно. Просто у нас есть утверждающие, мол ВТ нужно удалять всегда после последнего обращения. Мол так намного быстрее, лучше и вообще труЪ
31 Escander
 
13.10.14
14:30
(24) таки утверждаешь, что темпдб будет безразмерен если аптайм кластера серверов 8.2 долог?
32 SeiOkami
 
13.10.14
14:30
(30), а потом запросы открываешь, где половина пакетов - удаление результатов других пакетов
33 AlexITGround
 
13.10.14
14:31
(16) а как же "хочу именно вот таким образом", а то ж если вложенными делать, то в итоге с оптимизацией СУБД может получиться совсем другой запрос?
34 Kamas
 
13.10.14
14:32
(28) в тексте запроса э то в тексте запроса вы говорили (20)
35 vde69
 
13.10.14
14:32
(30) это хоороший стиль, суть такого подхода - не зависить от косяков будующих релизов платформы.

но тут нужно знать во всем меру, по тому как если у меня 200 таблиц и пытатся их все закрыть в том-же запросе - читабельность упадет ниже плинтуса...
36 H A D G E H O G s
 
13.10.14
14:32
(30) Если у тебя 100 ВТ размером по 10 мегабайт каждая - они заставят распухнуть tempdb очень быстро, если их в пакете сразу же не удалять.
Но 100 ВТ размером по 10 мегабайт - это лютый пздц.
37 SeiOkami
 
13.10.14
14:34
(36), понял. То бишь в случаях больших объёмов лучше сразу удалить, чем тянуть до последнего
38 SeiOkami
 
13.10.14
14:35
(35), ну даже не знаю. Как "стиль" уже очень раздражает.
39 H A D G E H O G s
 
13.10.14
14:36
(37) Я забиваю на такую фигню. tempdb шринкуется ночью.
40 ultrannge89
 
13.10.14
14:36
Предположу что наверное сам запрос не очень оптимизирован, если почитать последнюю моя тему, там я тоже вначале делал 8вт, а к концу концу уже 4...
41 vde69
 
13.10.14
14:37
(36) из личного опыта, база 30 гигов, темДБ примерно 150 гигов....

После оптимизации стало примерно 30... да и скорость увеличилась...
42 H A D G E H O G s
 
13.10.14
14:38
(41) 150 гигов - за день???!!!
43 Necessitudo
 
13.10.14
14:39
Ну я смотрел профайлер и там видно, что после каждого запроса с использование ВТ 1С-ка добавляет в конце запроса "truncate" на эту временную таблицу. То есть таблица очищается, а потом запихивается  в tempdb для последующего использования.
44 H A D G E H O G s
 
13.10.14
14:40
(43) "а потом запихивается  в tempdb для последующего использования"

Че?
45 vde69
 
13.10.14
14:41
(41) это размер файла темп-дб после суток работы, шринк каждую ночь...

а на этом серваке таких баз было 4, тестовая, распределенка и для разработки, терабайтного диска не хватало под четыре 30 гиговые базы, руководству это было обьяснить тяжеловато :)
46 Drac0
 
13.10.14
14:41
(16) Пожалей оптимизатор скуля. План для вложенных запросов сильно зависят от текущей статистики, нагрузки, расположения звезд. Сейчас может построиться мега-оптимальный план, а через 5 минут наоборот. ВТ в этом плане намного стабильнее.
47 rsv
 
13.10.14
14:41
(16) Ничего что  движок 1С полностью  заточен под ВТ ? Можно гирлянду складывать .. начинается #t1..... #t23  и так далее
48 rsv
 
13.10.14
14:43
Любая  движковая виртуальная талица ...  провести ... записать... - это временные таблицы и temp
49 ultrannge89
 
13.10.14
14:43
(46) У меня у одного глаза на лоб лезут когда начинаешь разбираться в чужом вложенном запросе... Даже ради того чтобы потом легко было вкурить, можно пожертвовать 2-3 сек спорного быстродействия и писать с ВТ.
50 Necessitudo
 
13.10.14
14:47
(44) Что слышал. Транкейт это не дроп.
51 H A D G E H O G s
 
13.10.14
14:52
(50) Я понимаю, что такое дроп и транкейт. Я не понимаю порядок мыслей в твоем предложении.
52 Necessitudo
 
13.10.14
14:53
(51) Ну на создание временной таблицы тратится время. Видимо быстрее положить пустую таблицу в tempdb, чтобы потом при надобности не создавать новую, а использовать существующую.
53 Ник второй
 
13.10.14
14:56
(16) Ты в крайней степени не прав.
54 Ник второй
 
13.10.14
14:57
(20) Нет не так. ВТ грохнется еще до того, как ты рохнешь Запрос, а именно в момент выполнения запроса "Выполнить()". Если конечно не оставляем в живых МВТ
55 Necessitudo
 
13.10.14
14:57
(53) Иногда запрос настолько длинный, что для сокращения тупо проще использовать вложенный запрос.
56 Ник второй
 
13.10.14
14:58
(21) Сборщик мусора тут не причем.
57 Ник второй
 
13.10.14
14:59
(55) Запрос нужно писать, что бы он выдавал прогнозируемый результат за прогнозируемое время, а не по количеству строк.
58 Necessitudo
 
13.10.14
15:00
(57) Если потом с тебя потребуют его быстро переписать, то какая-то оптимальность становится не так уж и важной)
59 Sammo
 
13.10.14
15:01
Если мне не изменяет мой склероз, то был баг платформы, правда скорее всего еще в 8.1, когда временные таблицы не удалялись если в явном виде не указать уничтожить или не зачистить менеджер.
Исходя из этого я всегда стараюсь за собой подчищать.

(16) Часто видел, когда некоторый прирост проивзодительности давал просто переход на временные таблицы и отказ от вложенных запросов. Причина - несмотря на то, что временные таблицы писались в темпдб план запроса становился более прогнозируемым и оптимальным.
60 Kamas
 
13.10.14
15:02
(58) да а в процессе переписывания вдруг неожиданно нужно сделать левое соединение 1 вложенного с предпоследним
61 Kamas
 
13.10.14
15:02
(59) в 8.1 было
62 Ник второй
 
13.10.14
15:03
(57) Переписать запрос с временными запросами проще. Но опять же повторюсь, что при написании запроса на в первую очередь упирать на предсказуемость результат и скорости выполнения.
63 Necessitudo
 
13.10.14
15:05
(62) Лишь бы работало - а уж после жалоб пользователей можно и оптимизировать. Знаю, звучит дико - но деваться некуда, план же требуют)
64 Sammo
 
13.10.14
15:05
(62) И вот здесь, имхо, у временных таблиц более предсказуемые параметры - скуль будет формировать план более предсказумео (из-за того, что запрос разбит на более простые части)
65 Ник второй
 
13.10.14
15:06
(63) План посылается далеко и надолго.
На самом деле рекомендаций по написанию запросов не много и можно их следовать на автомате.
66 Ник второй
 
13.10.14
15:06
(64) Именно, поэтому временные таблицы в большинстве случаев являются наиболее предпочтительным вариантом.
67 vde69
 
13.10.14
15:13
еще ВТ имеет смысл при программном формировании текста запроса. это куда более понятно и каждую ВТ по отдельности можно открыть конструктором.
68 Dzenn
 
гуру
13.10.14
15:33
Упрощай и оптимизируй способы решения задач, тогда не придётся оперировать десятками временных таблиц.
69 Dzenn
 
гуру
13.10.14
15:34
А по сути вопроса - ВТ уничтожаются автоматически, и уничтожать их вручную требуется в очень редких случаях.
70 vogenut
 
13.10.14
15:53
О боже, какая каша в головах...
71 vogenut
 
13.10.14
15:56
(0) По теме, удалять желательно после последнего использования:

- Таблица может быть переиспользована далее.
- Уменьшается нагрузка на tempdb в смысле объема инфы содержащейся в данный момент
72 John83
 
13.10.14
16:10
кстати, в типовых ВТ уничтожаются крайне редко..
73 TormozIT
 
гуру
13.10.14
16:12
(71) Да, если нет уверенности, что размер временной таблицы будет не гигантским, то лучше ее удалять поскорее. В остальных случаях не вижу смысла.
74 sereban
 
13.10.14
16:31
Собственно вопрос стоял по автоматизации вставки в текст запроса строк: УНИЧТОЖИТЬ <ИмяВТ> в нужных местах
75 Йохохо
 
13.10.14
16:56
(74) Стр = СтрЗаменить(Запрос.Текст, " ", Символы.ПС);
Для Сч = 1 По Стр.КоличествоСтрок() Цикл
Если ВРЕГ(СтрПолучитьСтроку(Стр, Сч)) = "ПОМЕСТИТЬ" Тогда
Сч = Сч+1;
СтрВТ = СтрВТ + СтрПолучитьСтроку(Стр, Сч) + Символы.ПС;
КонецЕсли;
КонецЦикла;
Для Каждого Стр ИЗ СтрВТ
Запрос.Текст = Запрос.Текст + Символы.ПС + "ВоеныУничтожить " + Стр;
КонецЦикла;
100500 на телефон, - 500 за каждую ошибку
76 Надо работать
 
13.10.14
18:04
(75) за такой код ты платить должен. кровью!
77 Ник второй
 
14.10.14
09:11
(74) Как выяснили, что это не нужно.