empty basket
Ваша корзина пуста
Выберите в каталоге интересующий товар
и нажмите кнопку «В корзину».
Перейти в каталог
Заказать звонок
1С:Франчайзи. Аккредитованная IT компания
г. Курск, ул. Красной Армии д.23А
Пн-Пт: 8:30-17:30
Cб-Вс: Выходной
Заказать звонок
Войти

3 главных вопроса про временные таблицы: особенности и недостатки, место хранения, индексация

21 мар 2024
#Обзор

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

В данной статье мы рассмотрим три главных вопроса, касающихся временных таблиц: их особенности и недостатки, место хранения и индексация.

Временные таблицы — это объект СУБД, который хранится и управляется системой базы данных на временной основе. Никаких временных таблиц на сервере 1С нет, соответственно, не стоит путать их с таблицами значений. В тексте запросов их создание выполняется с помощью ключевого слова "ПОМЕСТИТЬ" для пакета запроса.



Применение временных таблиц позволяет:

  • упростить текст сложного запроса, разделив его на составные части;

  • в некоторых случаях ускорить выполнение запроса и уменьшить количество блокировок.

Время "жизни" временной таблицы 1С:

  • в течение времени исполнения запроса, либо

  • в течение времени жизни менеджера временных таблиц (исполнения процедуры в случае программной обработки менеджером).

В обоих случаях временная таблиц может быть уничтожена и ранее этого, с помощью (соответственно):

  • конструкции языка запросов, либо

  • метода МВТ.

Если требуется в рамках одного запроса определить две временные таблицы с одинаковым именем, одну из них нужно уничтожить вручную, поскольку в рамках одного запроса две временные таблицы с одинаковым именем существовать не могут.

Все временные таблицы создаются и хранятся в базе TempDB (системная база данных SQL Server), но это вовсе не значит, что они обязательно будут записываться на диск. Правильный ответ на вопрос о расположении данного объекта СУБД звучит так: все временные таблицы по умолчанию создаются в оперативной памяти, а именно – в буферном КЭШе. Такой способ работы создает максимальную производительность и эффективность. Ни для кого не секрет, что чтение из оперативной памяти происходит гораздо быстрее, чем чтение с диска.

Конечно, есть исключения. Например, если таблица слишком большая, то сервер может принять решение сбросить ее на диск. Также возможна ситуация, когда сервер по каким-либо причинам решил отдать память под другие данные, тогда таблица тоже будет записана на диск.

Одной из самых распространенных рекомендаций, касаемо временных таблиц является необходимость индексирования полей условий и соединений во временных таблицах. Эта рекомендация настолько очевидна, что уже практически никто не подвергает ее сомнению.



Однако на практике часто бывает так, что индексы во временных таблицах либо не используются, либо их использование только замедляет выполнение запроса. Можно сказать даже больше: мой опыт показывает, что польза от индексов во временных таблицах скорее является исключением, чем правилом. В свою очередь, это подчеркивает необходимость анализировать каждую конкретную ситуацию, где использование индексов может быть необязательным, и таких случаев гораздо больше.

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

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

 

Если Вы используете временную таблицу только в одном пакетном запросе, то ваша таблица «живет», пока выполняется этот пакетный запрос. Это значит, что менеджер временных таблиц был создан неявно.
Если временная таблица проиндексирована, то сначала будет удален индекс и только потом таблица.
Ситуация меняется, если Вы явно используете менеджер временных таблиц (МВТ), т.е. создаете соответствующий объект метаданных. Такая таблица будет удалена в любом из следующих вариантов:

Если Вы используете объект МВТ, то временные таблицы рекомендуется удалять одним из первых 2 методов, как только в них отпала необходимость, иначе они будут висеть в памяти сервера СУБД, пока процедура/функция не закончит работу, что не есть хорошо. Если же у Вас процедура, в которой был создан МВТ завершается как раз выполнением запроса, тогда, конечно, МВТ можно не удалять, т.к. сработает 3 условие.

Подведем итог: если Вы не используете МВТ, то явно удалять временную таблицу не требуется, она будет удалена после завершения пакетного запроса. Если явное объявление МВТ используется, то рекомендуется удалить таблицу вручную, например, в запросе командой «Уничтожить», либо методом МВТ.Закрыть()..


Недостатки в применении временных таблиц:

Если Вы активно используете временные таблицы, то у Вас может довольно сильно разрастаться база TempDB и в один прекрасный день может занять все свободное место на диске. Размер TempDB автоматически только увеличивается, но не уменьшается. Внутри файла место может как заниматься, так и освобождаться, но сам размер файла только увеличивается.

Чрезмерное упрощение запросов. Нельзя сказать, что это очень большой минус, но все же.
Часто временные таблицы используются как раз для упрощения сложных запросов, чтобы серверу было легче подобрать оптимальный план, и это правильно. Но можно встретить и другую крайность: запрос, который вполне можно было бы написать без временных таблиц, и он бы работал быстро и оптимально, все равно пишут через временные таблицы. Просто разработчику лень думать, как это можно сделать по-другому. Если можно написать оптимальный запрос без использования временных таблиц, то лучше обойтись без них.

Запрос с оптимальным кодом без временных таблиц в любом случае будет работать быстрее и использовать меньше ресурсов, чем запрос с временными таблицами.

Временные таблицы это инструмент для решения определенных задач, а не волшебная таблетка на все случаи жизни.

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