Что такое PG_TEMP в PostgreSQL для 1С
pg_temp — это пространство СУБД PostgreSQL для временных таблиц, то есть таблиц, существующих в пределах жизни одного соединения (в терминах СУБД) или сеанса (в терминах кластера 1С).
Такие таблицы мы можем увидеть в тексте запроса СУБД, если в запросе на языке запросов 1С присутствует конструкция ПОМЕСТИТЬ, которая и помещает выборку во временную таблицу. Таким образом созданием этой временной таблицей управляет разработчик.
Но не всегда появление данной таблицы зависит от разработчика.
В некоторых ситуациях мы можем обнаружить в тексте запроса pg_temp, создание которой не инициировали авторы кода.
Приведём пример реального запроса из технологического журнала:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
SELECT T1._IDRRef FROM _Reference100 T1 WHERE (((T1._Fld728 = CAST(0 AS NUMERIC))) AND (EXISTS(SELECT 1 FROM (SELECT 1 AS SDBL_DUMMY) SDBL_DUAL INNER JOIN _InfoRg2845 T2 ON ('\\010'::bytea = T2._Fld2846_TYPE AND '\\000\\000\\000d'::bytea = T2._Fld2846_RTRef AND T1._IDRRef = T2._Fld2846_RRRef) INNER JOIN _InfoRg4807 T3 ON (T2._Fld2847RRef = T3._Fld4808RRef) WHERE (((T2._Fld728 = CAST(0 AS NUMERIC))) AND (T3._Fld728 = CAST(0 AS NUMERIC))) AND (EXISTS(SELECT 1 FROM pg_temp.tt1 T4 WHERE (T4._INVALUELISTTRef IS NOT NULL AND T4._INVALUELISTRRef IS NOT NULL) AND ((T3._Fld4809_TYPE = '\\010'::bytea AND T3._Fld4809_RTRef = T4._INVALUELISTTRef AND T3._Fld4809_RRRef = T4._INVALUELISTRRef))))))) AND ((T1._Marked = FALSE) AND (T1._Fld7399RRef = '\\202T\\000\\025]r\\363\\023\\021\\354\\246\\215\\236\\216\\300\\376'::bytea)) LIMIT 100 |
В запросе присутствует таблица pg_temp.tt1.
Поискав следы ее создания в журнале ранее по времени. Обнаружим записи со созданию индекса:
1 |
create index tmpind_0 on pg_temp.tt1(_INVALUELISTTRef, _INVALUELISTRRef)' |
и самой таблицы:
1 2 3 4 5 |
INSERT INTO pg_temp.tt1 (_INVALUELISTTRef,_INVALUELISTRRef) VALUES($1,$2)',Prm=" p_1: '\\000\\000\\000\\354'::bytea p_2: '\\236p\\000\\025]r\\363\\023\\021\\354\\301o\\361\\310\\211\\260'::bytea",Prm=" p_1: '\\000\\000\\000\\266'::bytea p_2: '\\236p\\000\\025]r\\363\\023\\021\\354\\301o\\361\\317O>'::bytea" |
В нашем случае платформа сама посчитала необходимым и создала временную таблицу. Мы, конечно, не знаем всех мотивов, по которым это произошло, они скрыты под капотом платформы и достоверно известны только её разработчикам.
Но, известно, что сделано это было для оптимизации запросов с условием «В», связано с тем, что условие накладывается на поле составного типа и в условии есть ссылки на разные типы объектов.
В нашем случае подобная оптимизация привела к печальным последствиям.
Было организовано соединение с временной таблицей, которое заняло 65% времени выполнения всего запроса.
Это поведение, приводящее к ошибочной оптимизации, было исправлено в https://bugboard.v8.1c.ru/error/000098601.
Еще можно посмотреть
Похожие записи
- Расследование конфликтов управляемых блокировок (TTIMEOUT) 1С:Предприятия
- НАСТРОЙКА PG_PROFILE ДЛЯ POSTGRESQL 1.
- Статистика PostgreSQL при работе с 1С:Предприятием
- Настройка непрерывного архивирования (point-in-time-recovery, PITR) в PostgresPro 11 Linux
- Пропажа индексов дескрипторов в 1С:Документообороте
- Технологический журнал 1С и бесконечный цикл в коде 1С
- 1C тормозит и возникают ошибки. С чего начать расследование?
- Хранение файлов 1С в томах на nfs-шаре Linux
- Администрирование серверов 1С на Linux
- Настройка и сбор логов для анализа проблем производительности систем 1С на Linux