online_analyze. Поддержка 1С:Предприятие. Анализ данных после вызова SQL команд типа DML
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
ext.
Библиотека online_analyze предоставляет набор функций, которые немедленно обновляют статистику после операций INSERT, UPDATE, DELETE или SELECT INTO в целевых таблицах. Этот модуль требуется для поддержки системы 1С:Предприятие.
Доработка
Доработка не проводилась.
Ограничения
Ограничения отсутствуют.
Установка
Установка расширения online_analyze осуществляется во всех случаях, однако автоматическое включение и активация происходят только при выборе установки с поддержкой 1С, а также установки ролевой модели. Для установки данного расширения на уже развернутом экземпляре СУБД Pangolin необходимо загрузить расширение:
LOAD 'online_analyze';
SET online_analyze.enable = on;
Настройка
Настройте online_analyze, используя следующие дополнительные переменные (указаны значения по умолчанию):
online_analyze.enable(off): включаетonline_analyze;online_analyze.table_type(temporary): типы таблиц, для которых выполняется немедленный анализ;online_analyze.verbose(off): выполняетANALYZE VERBOSE;online_analyze.threshold(50): минимальное число изменений строк, после которого может начаться немедленный анализ;online_analyze.scale_factor(0.1): процент от размера таблицы, при котором начинается немедленный анализ;online_analyze.local_tracking(on): включает отслеживание временных таблиц в рамках обслуживающего процесса. Когда эта переменная отключена (off),online_analyzeиспользует для временных таблиц системную статистику по умолчанию;online_analyze.min_interval(10000): минимальный интервал времени между вызовамиANALYZEдля отдельной таблицы (в миллисекундах).
Использование модуля
Далее описывается пример использования расширения:
-
Загрузите и выключите расширение:
LOAD 'online_analyze';
SET online_analyze.enable = off; -
Создайте временную таблицу и заполните ее данными:
CREATE TEMP TABLE t (a INTEGER,v TEXT);
INSERT INTO t (SELECT *, CASE WHEN random() >= 0.5 THEN NULL ELSE 'y' END FROM generate_series(1,100)); -
Проверьте, что при добавлении новых данных количество ожидаемых строк в плане запроса не изменилось:
EXPLAIN SELECT * FROM t WHERE v IS NOT NULL;
INSERT INTO t (SELECT *, CASE WHEN random() >= 0.5 THEN NULL ELSE 'y' END FROM generate_series(200,300));
EXPLAIN SELECT * FROM t WHERE v IS NOT NULL;В первом и втором плане одинаковое количество ожидаемых строк (значение
rows=):QUERY PLAN
------------------------------------------------------
Seq Scan on t (cost=0.00..22.70 rows=1264 width=36)
Filter: (v IS NOT NULL)
(2 rows)
>
INSERT 0 101
QUERY PLAN
------------------------------------------------------
Seq Scan on t (cost=0.00..22.70 rows=1264 width=36)
Filter: (v IS NOT NULL)
(2 rows) -
Включите расширение:
SET online_analyze.enable = on; -
Проверьте, что при добавлении новых данных произведен автоматический анализ таблицы и количество ожидаемых строк в плане запроса изменилось:
EXPLAIN SELECT * FROM t WHERE v IS NOT NULL;
INSERT INTO t (SELECT *, CASE WHEN random() >= 0.5 THEN NULL ELSE 'y' END FROM generate_series(200,300));
EXPLAIN SELECT * FROM t WHERE v IS NOT NULL;Во втором плане должно быть другое количество ожидаемых строк (значение
rows):QUERY PLAN
------------------------------------------------------
Seq Scan on t (cost=0.00..22.70 rows=1264 width=36)
Filter: (v IS NOT NULL)
(2 rows)
>
INFO: analyzing "pg_temp_4.t"
INFO: "t": scanned 2 of 2 pages, containing 302 live rows and 0 dead rows; 302 rows in sample, 302 estimated total rows
INFO: analyze "t" took 0.00 seconds
INSERT 0 101
QUERY PLAN
---------------------------------------------------
Seq Scan on t (cost=0.00..5.02 rows=150 width=6)
Filter: (v IS NOT NULL)
(2 rows) -
Удалите временную таблицу:
DROP TABLE t;