Параллельный анализ таблиц
Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.
Описание
Параллельный анализ улучшает производительность операции ANALYZE за счет использования нескольких рабочих процессов для одновременной обработки данных. Данная функциональность позволит значительно сократить время анализа больших таблиц и множества таблиц одновременно, распределяя нагрузку между несколькими рабочими процессами.
Параллельный анализ реализуется двумя типами параллелизации операции ANALYZE:
- Чтение данных одной таблицы для анализа – применяется для оптимизации чтения данных при анализе одной большой таблицы, распределяя операции чтения блоков между параллельными рабочими процессами;
- Для нескольких таблиц одновременно – используется для распределения нагрузки анализа между параллельными рабочими процессами, когда в запросе указано несколько таблиц или разделенных таблиц (partitioned tables).
Назначение
Целью внедрения данной функциональности является повышение производительности анализа больших объемов данных, сокращение времени выполнения команды ANALYZE, а также улучшение использования системных ресурсов. Функциональность обеспечивает:
- Снижение времени анализа больших таблиц и множества таблиц.
- Гибкость в настройке уровня параллельного анализа, позволяя пользователям адаптировать параметры параллельного анализа под свои нужды.
- Поддержание совместимости с существующими рабочими процессами СУБД, минимизируя возможные изменения в уже работающих системах.
Ограничения
Функциональность имеет следующие ограничения:
- Общий параллельный анализ и анализ чтение данных для одной таблицы – не могут использоваться одновременно, поскольку параллельные рабочие процессы не могут создавать другие параллельные процессы.
- Временные таблицы обрабатываются последовательно, поскольку их данные хранятся в памяти, а не на диске. Это делает функциональность неэффективной для временных таблиц.
- Параллельный анализ не применяется к процессам вакуума, чтобы избежать чрезмерной нагрузки на систему из-за создания большого числа параллельных рабочих процессов.
Настройка
Активация функциональности происходит путем указания значения on для параметра analyze_parallel_fetch.
Дополнительно существуют другие конфигурационные параметры для настройки функциональности, о них в таблице «Конфигурационные параметры».
В зависимости от типа конфигурации сервера, реализованные настройки хранятся в различных файлах:
- для standalone-конфигурации — в файле
$PGDATA/postgresql.conf; - для кластерной конфигурации — в файле
/etc/pangolin-manager/postgres.yml.
Методами изменения этих параметров являются:
- в конфигурационном файле напрямую;
- в рамках сеанса, командой
SET.
Конфигурационные параметры
Параметр | Тип данных | Описание | Значение по умолчанию | Допустимые значения |
|---|---|---|---|---|
|
| Включает или отключает параллельное чтение данных |
|
|
|
| Задает максимальное количество рабочих процессов для параллельного чтения данных |
| [ |
|
| Задает минимальное количество страниц для параллельного сбора данных |
| [ |
|
| Определяет количество рабочих процессов, используемых по умолчанию для параллельного анализа, если количество рабочих процессов не указано в аргументе команды |
| [ |
|
| Определяет максимальное количество страниц, обрабатываемых за одну операцию анализа. Если этот параметр установлен на ненулевое значение, будет просканировано не более |
| [ |
|
| Определяет размер массива, используемого для хранения статистики анализа. Если этот параметр установлен на значение, отличное от |
| [ |
Управление
Параллельный анализ для нескольких таблиц
Для запуска параллельный анализ, используйте аргумент PARALLEL_ANALYZE <num_workers>, где <num_workers> – количество рабочих процессов. Если количество не указано, используется значение заданное параметром default_analyze_workers.
Особые случаи
- Временные отношения не обрабатываются параллельно, а будут выполняться последовательно через запускающий процесс.
- Одно обычное отношение обрабатывается запускающим процессом без запуска дополнительных рабочих процессов.
- Если количество рабочих процессов
PARALLEL_ANALYZEпревышает количество отношений, тогда запускается только необходимое количество процессов, так как для дополнительных не будет работы.
Параллельное чтение данных для анализа одной таблицы
Во время анализа одной таблицы, если количество блоков таблицы превышает значение min_pages_for_parallel_fetch, создаются параллельные рабочие процессы. Эти рабочие процессы отвечают за выборку блоков независимо из своей части таблицы.
Примеры команд запуска параллельного сбора данных
-
Запуск с указанием количества рабочих процессов:
ANALYZE (PARALLEL_ANALYZE 4) table1, table2, ..., table100; -
Запуск с использованием значения по умолчанию:
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
Проверяйте журналы на наличие записей, связанных с параллельным сбором данных, которые предоставят информацию о количестве использованных рабочих процессов, обработанных блоках и ходе анализа.
Альтернативным вариантом диагностики механизма является проверка количества рабочих процессов в системе напрямую, без повышения уровня логирования.
Сценарии использования
Параллельный анализ выполняется и обновляет статистику для таблиц, в том числе после процесса анализа
-
Установите параметры конфигурации:
ALTER SYSTEM SET analyze_parallel_fetch TO 'false';
ALTER SYSTEM SET analyze_parallel_fetch_workers TO 3; -
Создайте обычные таблицы (в примере
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;
$$;Ожидаемый результат: Таблицы созданы и заполнены.
-
Заполните индексы:
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); -
Создайте пользовательскую статистику:
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; -
Выполните параллельный анализ:
ANALYZE (PARALLEL_ANALYZE 3) reg_table, part_table;Ожидаемый результат: Анализ успешно осуществлен.
-
Проверьте обновление статистики:
SELECT tablename, attname AS column_name, most_common_vals
FROM pg_stats
WHERE tablename = 'reg_table' OR tablename LIKE 'part_table%';Ожидаемый результат: Статистика обновлена.
-
Проверьте пользовательскую статистику:
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';Ожидаемый результат: Статистика успешно отображена.
-
Сравните производительности последовательного и параллельного анализа, например, с помощью следующих команд:
ANALYZE reg_table, part_table;
ANALYZE (PARALLEL_ANALYZE 3) reg_table, part_table;Ожидаемый результат: Параллельный анализ завершиться быстрее, чем последовательный анализ, демонстрируя улучшение производительности.