Предположим, что у нас есть запрос в 1С, в тексте которого создаются несколько временных таблиц. По ходу выполнения запроса некоторые временные таблицы становятся не нужны и их теоретически можно уничтожить, написав команду УНИЧТОЖИТЬ. Менеджер временных таблиц не установлен.
Вопрос в том, есть ли какой-то практический смысл в уничтожении временных таблиц сразу же после того, как они перестали быть нужными в такой ситуации? 1С их все равно уничтожит (точнее, очистит) сразу после того, как запрос будет выполнен, но мы можем сделать это чуть раньше по ходу выполнения запроса, сразу после того, как в той или иной временной таблицы отпала необходимость. Есть ли от этого какая-то польза? Или можно не загромождать текст запроса бесполезными командами УНИЧТОЖИТЬ?
(3) Если вооружиться SQL-профайлером, то можно увидеть, что после выполнения запроса, который создает временные таблицы и не имеет менеджера временных таблиц, 1С делает truncate table для всех созданных в запросе временных таблиц.
(1) Kaiden, Удалять нужно обязательно если временные таблицы очень большие например больше 1гб... даже если вы удалите запрос например "Запрос=Null" не всегда удалятся все временные таблицы т.к связь в памяти запроса и ВТ в исключительных ситуациях может быть утеряна в период выполнения запроса. Это редкость но факт по этому когда ВТ сверх большие заведите себе привычку всегда удалять ВТ. Это удаление ВТ введено в качестве перестраховки. Ну и как выше говорилось у вас при очень большом запросе с ужасно большими временными таблицами может резко упасть производительность системы и в исключительных случаях даже выкинуть с 1Ски если не сработает вспомогательное удаление ВТ (при большой нехватки памяти озу и на харде в 1C происходит удаление ВТ для возможности создать другую и при обращении к удаленной ВТ заново делается запрос и ВТ создается заново но это когда у вас память совсем встала). Это не задокументированная особенность системы.
(2) понимаю, что поздно уже тут писать, но вот что заметил.
В программе есть управляемая форма с динамическим списком.
Сначала был запрос, в котором созданы временные таблицы, с которых основной запрос вытаскивает уже данные. Всё это работало прекрасно.
Но потом, как умный Ваня, сделал
1. Создание временных таблиц;
2. Основной запрос;
3. Удаление временных таблиц.
Так вот после добавления 3 пункта у меня 1С поработает и вылетает с ошибкой CPP...
Платформа: 1С:Предприятие 8.3 (8.3.10.2650)
Конфигурация: Архиватор баз 1С и файловых ресурсов (файловая версия) (1.11.0.0 (171229))
Поставщик архиваторов (...)
Режим: Файловый (без сжатия)
Приложение: Тонкий клиент
Локализация: Информационная база: русский (Россия), Сеанс: русский
Вариант интерфейса: Такси
Ошибки:
--------------------------------------------------------------------------------
29.01.2018 22:42:15
Недопустимое состояние объекта
[entext - src\Select.cpp (28173)]
(2)
На одном франчайзи была целая дискуссия о том стоит ли удалять таблицы во время формирования запроса.
Пришли к выводу, что это зависит от требуемого быстродействия и возможностей сервера.
Если требуется быстродействие и достаточно памяти сервера, то не стоит удалять таблицы, т.к. на это требуется время. Сервер и сам затем подчистит временные таблицы, как писал Kaiden.
(7) Kaiden, и той и другой - чем больше дискового пространства и выше скорость винта и чем больше оперативной памяти может "сожрать" 1с - тем быстрей отработает Ваш запрос = это извечный закон 1С 8.
Я не чищу таблицы обычно - разве только если пишу для Инфостарта с открытым кодом. )))
В большой умной желтой книге по 1С таблицы не "убивают". "Убивать" их стали в методичках 1С.
Вообще выбирайте экспериментально для своего сервера с замерами производительности.
(10) Ну, с памятью на жестком диске, по идее, проблем быть не должно - на серверах память обычно исчисляется терабайтами, с трудом представляю, чтобы временные таблицы могли "забить" весь диск. С оперативной памятью - да, но у меня нет полной уверенности, что эти временные таблички могут храниться в оперативной памяти, а не сразу пишутся на диск...
Что касается того, что на удаление временных таблиц (в запросе) требуется время, я тоже полностью не уверен, что, если не делать этого, 1С сразу вернет результат запроса, а не сначала сама почистит временные таблицы, а потом вернет результат запроса...
В книге знаний Миста: Если временных таблиц много и они висят в памяти не удаленные не очищенные возникает эффект постоянной загруженности сервера 1с предприятие как будто этот процесс выполняет все время какой то тяжелый запрос или обработку что сказывается на производительности системы в целом. Временную таблицу нужно удалять как можно скорее после использования.
Я этой статье с Мисте не особо верю :)
Надо проверять, конечно, но каким образом временные таблицы могут грузить сервер приложений 1С? Еще можно было бы понять, что они бы грузили сервер СУБД...
Хотя для точности нужно проверять, конечно.
(14) Если менеджер временных таблиц в запросе не установлен, все временные таблицы (созданные командой ПОМЕСТИТЬ) будут очищены сразу после выполнения запроса. Таким образом, они будут недоступны для использования в последующих запросах.
Если МВР установлен, то временная таблица после выполнения запроса очищена не будет и будет как бы храниться в этом МВР. В дальнейших запросах, использующих этот же МВР, можно будет обращаться к этой временной таблице. Временные таблицы будут очищены в этом случае либо при прямом использовании команды УНИЧТОЖИТЬ, либо когда объект Запрос, в котором установлен МВР, перестанет существовать.
Была проблема следующего рода: На связке 1С УПП, сервера 1С x64 и PostgreSQL (все это под управлением CentOS)при удалении временных таблиц - платформа 1С падала, вслед за ней падал и весь сервер 1С.
ИМХО, имеет смысл удалять ВТ только в том случае, если используется менеджер временных таблиц, т.к. на время существования менеджера ВТ будут существовать, а следовательно, не нужные ВТ будут также висеть в памяти, а их следовало бы удалить. Вот как-то так)
Удалять всегда, особенно кто еще работает на 8.1, да и на 8.2 не мешает. Очень часто происходит дефрагментация памяти , что приводик к ее учеткам. Пока менеджер 1С (сборщик мусора :)) плохо справляется со своей работой :)
Вопрос об удалении ВТ, кстати, не праздный. Получили однажды на скуле ошибку, когда база tempdb заполнила собой весь раздел на диске! Отсюда вопрос: это проблема некорректно работающей конфигурации/платформы (не удаляются ВТ) или выделения объема под tempdb, т.е. проблема DBA? Для справки: объем диска (целиком отдан под tempdb) был 270Гб...
(21) AlexS2, при больших вт всегда 1С пишет в тем данные... но к большому сожалению не всегда их удаляет... обычно нужно перезагружать комп или полностью останавливать сервер и запускать заново.
1) Тут все пишут про временные таблицы. Действительно, это могло вызвать проблему, если допустим сеанс пользователя оборвался (экстренно упал процесс rphost или какие-то другие причины), следовательно платформа не смогла удалить эти временные таблицы и они остались висеть в tempdb. Те, кто пишут про оперативную память, видимо не понимают, что временные таблицы в случае связки с ms sql всегда пишутся в tempdb и лишь потом в случае необходимости помещаются в оперативную память.
По поводу очистки временных таблиц в случае использования менеджера - в 8.1 это обязательно нужно делать, т.к. таблицы хранятся до закрытия последнего соединения; в 8.2 это желательно, но необязательно, т.к. разработчики платформы сделали автоочистку таблиц (но в некоторых экстренных случая, как я описал выше она может не сработать).
2) Кроме временных таблиц причиной может служить неоптимальные запросы (особенно если используются ограничения RLS). В случае, когда запрос достаточно тяжелый его составные части могут создавать отдельные таблицы в кеше, которые будут помещены также в tempdb (можно искать в плане запроса ключевое слово spool).
Чаще всего на практике присутствует комбинация из этих двух факторов. Следовательно, во всем виноваты "программисты" 1С (если не хватает 270Гб для tempdb не поставить кавычки никак не могу) или в редких случаях некорректное поведение платформы 1С. DBA тут не причем, но расхлебывать придется ему (периодически сжимать tempdb или перезапускать сервер).
Подскажите, пожалуйста: у нас очень сильно выросла база "1С: УПП". Пробовали сжимать на sql, после расчета с/с опять сильно увеличивается. Сейчас опять увеличилась, при просмотре на sql выдается, что 44% свободного места. Почему может так расти база. Что можно посмотреть, чтобы уменьшить размер?
(28) временные таблицы - создаются как #tt1, #tt2 ... на самом SQL Server
и хранятся в системной таблице (файле) TempDB.
Даже если таблица удаляется, файл не уменьшается в объёме!
как долго хранятся данные таблиц не понятно, наверное от настроек SQL-сервера зависит...
но то, что файл TempDB растёт постоянно (сам не уменьшается! ) - это факт
помогает только полная перезагрузка SQL server или сервера целиком
или надо специально создавать "регламентное" задание на самом SQL - для сжатия TempDB
(и его log файла тоже )
если TempDB специально не переносили на большой диск, то он на системном диске С сервера
(не большом обычно) и легко может занять весь диск С - а это полный капец!