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

Параллельный анализ таблиц

Сведения

Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.

Описание​

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

Параллельный анализ реализуется двумя типами параллелизации операции ANALYZE:

  • Чтение данных одной таблицы для анализа – применяется для оптимизации чтения данных при анализе одной большой таблицы, распределяя операции чтения блоков между параллельными рабочими процессами;
  • Для нескольких таблиц одновременно – используется для распределения нагрузки анализа между параллельными рабочими процессами, когда в запросе указано несколько таблиц или разделенных таблиц (partitioned tables).
Внимание!

Приведенные методы несовместимы друг с другом.

Назначение​

Целью внедрения данной функциональности является повышение производительности анализа больших объемов данных, сокращение времени выполнения команды ANALYZE, а также улучшение использования системных ресурсов. Функциональность обеспечивает:

  • Снижение времени анализа больших таблиц и множества таблиц.
  • Гибкость в настройке уровня параллельного анализа, позволяя пользователям адаптировать параметры параллельного анализа под свои нужды.
  • Поддержание совместимости с существующими рабочими процессами СУБД, минимизируя возможные изменения в уже работающих системах.

Ограничения​

Функциональность имеет следующие ограничения:

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

Настройка​

Активация функциональности происходит путем указания значения on для параметра analyze_parallel_fetch.

Дополнительно существуют другие конфигурационные параметры для настройки функциональности, о них в таблице «Конфигурационные параметры».

В зависимости от типа конфигурации сервера, реализованные настройки хранятся в различных файлах:

  • для standalone-конфигурации — в файле $PGDATA/postgresql.conf;
  • для кластерной конфигурации — в файле /etc/pangolin-manager/postgres.yml.

Методами изменения этих параметров являются:

  • в конфигурационном файле напрямую;
  • в рамках сеанса, командой SET.

Конфигурационные параметры​

Параметр

Тип данных

Описание

Значение по умолчанию

Допустимые значения

analyze_parallel_fetch

boolean

Включает или отключает параллельное чтение данных

false

true/false

max_analyze_fetch_workers

integer

Задает максимальное количество рабочих процессов для параллельного чтения данных

3

[1 - MAX_BACKENDS] - Что такое MAX_BACKENDS расписать

min_pages_for_parallel_fetch

integer

Задает минимальное количество страниц для параллельного сбора данных

10000

[1000 - INT_MAX]

default_analyze_workers

integer

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

3

[1 - MAX_BACKENDS]

analyze_max_pages

integer

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

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

0

[0 - INT_MAX]

analyze_stat_array_size

integer

Определяет размер массива, используемого для хранения статистики анализа.

Если этот параметр установлен на значение, отличное от -1, то как количество наиболее часто встречающихся значений (MCV), так и гистограммы будут установлены на analyze_stat_array_size

-1

[-1 - INT_MAX]

Управление​

Параллельный анализ для нескольких таблиц​

Для запуска параллельный анализ, используйте аргумент PARALLEL_ANALYZE <num_workers>, где <num_workers> – количество рабочих процессов. Если количество не указано, используется значение заданное параметром default_analyze_workers.

Особые случаи​

  1. Временные отношения не обрабатываются параллельно, а будут выполняться последовательно через запускающий процесс.
  2. Одно обычное отношение обрабатывается запускающим процессом без запуска дополнительных рабочих процессов.
  3. Если количество рабочих процессов PARALLEL_ANALYZE превышает количество отношений, тогда запускается только необходимое количество процессов, так как для дополнительных не будет работы.

Параллельное чтение данных для анализа одной таблицы​

Во время анализа одной таблицы, если количество блоков таблицы превышает значение min_pages_for_parallel_fetch, создаются параллельные рабочие процессы. Эти рабочие процессы отвечают за выборку блоков независимо из своей части таблицы.

Примеры команд запуска параллельного сбора данных​

  1. Запуск с указанием количества рабочих процессов:

    ANALYZE (PARALLEL_ANALYZE 4) table1, table2, ..., table100;
  2. Запуск с использованием значения по умолчанию:

    ANALYZE (PARALLEL_ANALYZE) table1, table2, ..., table100;
примечание

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

Проверка возможности параллельного сбора данных​

Параллельный сбор данных не будет использоваться в случаях, когда:

  • Параллельный сбор данных отключен (analyze_parallel_fetch = false).
  • Отношение является временной таблицей.
  • Процесс уже находится в параллельном режиме или является процессом автоочистки (AUTOVACUUM).
  • Таблица имеет меньше страниц, чем минимально указано (min_pages_for_parallel_fetch).
  • Указано менее 2 рабочих процессов (max_analyze_fetch_workers < 2).
  • Сервер не работает под процессом postmaster.

Параметры конфигурации для операций анализа​

В файле конфигурации параметры для операций анализа можно установить следующие рекомендуемые значения:

analyze_max_pages = 1000 # Сканирует не более 1000 страниц во время анализа
analyze_stat_array_size = 200 # Устанавливает количество MCV и гистограмм на 200

Диагностика​

Установите уровень логирования для мониторинга операций параллельного сбора данных:

Предупреждение!

Данный уровень логирования следует включать только на время диагностики корректной работы механизма функциональности.

Не рекомендуется устанавливать данный уровень логирования на производственных системах из-за возможного увеличения нагрузки на подсистемы ввода-вывода и памяти.

log_min_messages = debug1

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

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

Сценарии использования​

Параллельный анализ выполняется и обновляет статистику для таблиц, в том числе после процесса анализа​

  1. Установите параметры конфигурации:

    ALTER SYSTEM SET analyze_parallel_fetch TO 'false';
    ALTER SYSTEM SET analyze_parallel_fetch_workers TO 3;
  2. Создайте обычные таблицы (в примере reg_table, reg_table2), а также партиционированные таблицы и заполните их. Пример создания таблиц:

    CREATE TABLE reg_table (
    id serial PRIMARY KEY,
    someint int,
    sometext text,
    somebool bool
    );

    CREATE TABLE reg_table2 (
    id serial PRIMARY KEY,
    someint int,
    sometext text,
    somebool bool
    );
    CREATE TABLE part_table (
    id bigint PRIMARY KEY,
    someint int,
    sometext text,
    somebool bool
    ) PARTITION BY RANGE (id);
    DO $$
    DECLARE
    j int = 1;
    tempv int = 100000;
    BEGIN
    FOR i IN 1..10 LOOP
    EXECUTE
    'CREATE TABLE part_table_' || i || ' PARTITION OF part_table
    FOR VALUES FROM (' || j || ') TO (' || tempv || ');';
    j = tempv;
    tempv = j + 100000;
    END LOOP;
    END;
    $$;

    Ожидаемый результат: Таблицы созданы и заполнены.

  3. Заполните индексы:

    CREATE INDEX reg_idx ON reg_table((someint * 99));
    CREATE INDEX reg_idx2 ON reg_table2(someint);
    CREATE INDEX part_idx ON part_table(someint);
  4. Создайте пользовательскую статистику:

    CREATE STATISTICS reg_stats (dependencies) ON someint, sometext FROM reg_table;
    CREATE STATISTICS reg_stats2 (dependencies) ON someint, sometext FROM reg_table2;
    CREATE STATISTICS part_stats (dependencies) ON someint, sometext FROM part_table;
  5. Выполните параллельный анализ:

    ANALYZE (PARALLEL_ANALYZE 3) reg_table, part_table;

    Ожидаемый результат: Анализ успешно осуществлен.

  6. Проверьте обновление статистики:

    SELECT tablename, attname AS column_name, most_common_vals
    FROM pg_stats
    WHERE tablename = 'reg_table' OR tablename LIKE 'part_table%';

    Ожидаемый результат: Статистика обновлена.

  7. Проверьте пользовательскую статистику:

    SELECT stxname, stxoid, stxdndistinct, stxddependencies, stxdmcv
    FROM pg_statistic_ext_data
    JOIN pg_statistic_ext ON (stxoid = oid)
    WHERE stxname = 'reg_stats' OR stxname = 'part_stats';

    Ожидаемый результат: Статистика успешно отображена.

  8. Сравните производительности последовательного и параллельного анализа, например, с помощью следующих команд:

    ANALYZE reg_table, part_table;
    ANALYZE (PARALLEL_ANALYZE 3) reg_table, part_table;

    Ожидаемый результат: Параллельный анализ завершиться быстрее, чем последовательный анализ, демонстрируя улучшение производительности.