Перейти к основному содержимому

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 для отдельной таблицы (в миллисекундах).

Использование модуля

Далее описывается пример использования расширения:

  1. Загрузите и выключите расширение:

    LOAD 'online_analyze';
    SET online_analyze.enable = off;
  2. Создайте временную таблицу и заполните ее данными:

    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));
  3. Проверьте, что при добавлении новых данных количество ожидаемых строк в плане запроса не изменилось:

    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)
  4. Включите расширение:

    SET online_analyze.enable = on;
  5. Проверьте, что при добавлении новых данных произведен автоматический анализ таблицы и количество ожидаемых строк в плане запроса изменилось:

    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)
  6. Удалите временную таблицу:

    DROP TABLE t;