digital-garden/dev/database/postgresql/Частичный индекс.md
2024-10-25 20:04:39 +03:00

6.0 KiB
Raw Blame History

aliases tags date
maturity/🌱
2024-10-21

Можно создать частичный индекс по условию, который покрывает только записи, удовлетворяющие определенному условию WHERE.

Например, можно исключить из индекса по внешнему ключу (FK) значения NULL:

CREATE INDEX fk_not_null ON pgconf(fk_id)
WHERE fk_id IS NOT NULL;

При этом работа индекса не ускоряется, так как СУБД автоматически оптимизирует выполнение запроса. Однако, ==это позволит уменьшить размер индекса, что на больших объемах данных также может положительно сказаться на производительности.== Поиск в индексе размером 15 ГБ выполняется быстрее, чем в индексе на 200 ГБ.

Преимущества:

  • Уменьшение размера индекса: Индекс включает только необходимые записи, что уменьшает его общий объём.
  • Ускорение запросов: Частичный индекс может улучшить производительность запросов, особенно если он используется для выборки узко определённых данных.
  • Оптимизация операций обновления: Поскольку индекс обновляется только для определённых строк, уменьшаются накладные расходы на запись и обновление данных.

Недостатки:

  • Ограниченная применимость: Частичные индексы не всегда подходят, особенно для данных с высокой селективностью, где обычные индексы будут более эффективны.
  • Сложность настройки: Необходимо тщательно выбирать условия WHERE, чтобы получить максимальную пользу от частичного индекса. Неправильный выбор условий может привести к ухудшению производительности.

Когда использовать частичные индексы:

  • Когда необходимо уменьшить размер индекса за счёт исключения ненужных записей, что позволяет сэкономить место на диске и ускорить операции поиска.
  • Когда таблица содержит большое количество записей с одинаковыми значениями (низкая ../Селективность колонки), и вам нужно индексировать только те записи, которые имеют уникальные или более специфичные значения.
  • В ситуациях, когда индекс нужен для работы с данными, которые соответствуют определённому условию, например, только "необработанные" записи.

Таблицы с колонкой статуса

Часто в приложениях есть таблицы, которые содержат колонку статуса (state). Обычно статус разделяет записи на "обработанные" и "необработанные". Индекс нам часто нужен именно по необработанным данным. Создавая частичный индекс только по необработанным данным, мы можем ускорить выполнение запроса и уменьшить размер индекса.

Возьмем типичную табличку, в которой есть какие-то статусы мы хотим находить данные по этому статусу.

300 600

Часто появляется желание сделать индекс по полю статуса:

600

Но по факту мы индексируем поле, которое имеет небольшую селективность. Такой индекс не эффективный.

Хороший вариант в данном случае: 600

Почти идеальный: 600 500

Идеальный. Совмещаем и ../../../dev/database/postgresql/Составной индекс в PostgreSQL и частичный.

!../../../meta/files/images/Pasted image 20241021225124.png


Мета информация

Область:: ../../../meta/zero/00 PostgreSQL Родитель:: Индекс в PostgreSQL, Оптимизация SQL запросов в PostgreSQL Источник:: Создана:: 2024-10-21 Автор::

Дополнительные материалы

Дочерние заметки