Погіршення швидкодії запитів у кабінетах користувачів при накопиченому великому обсягу даних в історичних таблицях

У процесі використання реєстрів із великим обсягом даних можуть виникати ситуації уповільнення запитів до історичних таблиць (bpm_history_process та bpm_history_task).

Для пришвидшення запитів до історичних таблиць рекомендовано виконати їх індексацію.

Застосування індексів можна виконати:

  1. За допомогою pgAdmin:

    У pgAdmin відкрийте схему "public" та оберіть базу "process_history".

    Натисніть праву кнопку миші та виберіть «Query Tool» у контекстному меню.

  2. За допомогою терміналу (у промисловому середовищі):

    Виконання наступних дій можливе лише за наявності прав Адміністратора Платформи.

    Відкрийте термінал поди "operational-instance".

    Треба увійти до бази даних "process_history" під користувачем "postgres", виконавши команду:

    sql -U postgres process_history

Виконайте наступні кроки:

Виконання цих кроків потребує вікно обслуговування реєстру.

Для створення або видалення індексів у промисловому середовищі рекомендується використовувати атрибут CONCURRENTLY.

Він дозволяє уникнути блокування бази даних, хоча операція може тривати довше. Запити з CONCURRENTLY потрібно виконувати окремо (один за одним).

  1. Видалити два наявні індекси, а саме:

    DROP INDEX CONCURRENTLY IF EXISTS public.bpm_history_process__start_user_id__state__start_time__i;
    DROP INDEX CONCURRENTLY IF EXISTS public.bpm_history_process__start_user_id__state__end_time__i;
  2. Створити нові:

    CREATE INDEX CONCURRENTLY IF NOT EXISTS bpm_hp__start_user_id__state__i
        ON public.bpm_history_process USING btree
        (start_user_id COLLATE pg_catalog."default" ASC NULLS LAST, state COLLATE pg_catalog."default" ASC NULLS LAST)
        TABLESPACE pg_default;
    CREATE INDEX CONCURRENTLY IF NOT EXISTS bpm_hp__start_user_id__state_active__start_time__i
        ON public.bpm_history_process USING btree
        (start_user_id ASC, start_time ASC)
        WHERE super_process_instance_id IS NULL AND state IN ('ACTIVE', 'SUSPENDED');
    CREATE INDEX CONCURRENTLY IF NOT EXISTS bpm_hp__start_user_id__state_active__end_time__i
        ON public.bpm_history_process USING btree
        (start_user_id ASC, end_time DESC)
        WHERE super_process_instance_id IS NULL AND state IN ('ACTIVE', 'SUSPENDED');
    CREATE INDEX CONCURRENTLY IF NOT EXISTS bpm_hp__start_user_id__state_completed__start_time__i
        ON public.bpm_history_process USING btree
        (start_user_id ASC, start_time ASC)
        WHERE super_process_instance_id IS NULL AND state IN ('EXTERNALLY_TERMINATED', 'COMPLETED');
    CREATE INDEX CONCURRENTLY IF NOT EXISTS bpm_hp__start_user_id__state_completed__end_time__i
        ON public.bpm_history_process USING btree
        (start_user_id ASC, end_time DESC)
        WHERE super_process_instance_id IS NULL AND state IN ('EXTERNALLY_TERMINATED', 'COMPLETED');
    CREATE INDEX CONCURRENTLY IF NOT EXISTS bpm_ht__assignee__root_process_instance_id__i
        ON public.bpm_history_task
        USING btree (assignee, root_process_instance_id);

У результаті виконання запитів буде створено п’ять нових індексів для таблиці bpm_history_process та один індекс для таблиці bpm_history_task.

Перевірити наявність індексів можна:

  1. За допомогою pgAdmin:

    add index tables 1

    add index tables 2

  2. За допомогою терміналу:

    SELECT indexname FROM pg_indexes WHERE tablename = 'bpm_history_process' OR tablename = 'bpm_history_task';

Також потрібно оновити статистику бази даних, яку використовує планувальник запитів:

ANALYZE bpm_history_process;
ANALYZE bpm_history_task;