70 lines
6.0 KiB
Markdown
70 lines
6.0 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
tags:
|
|||
|
- maturity/🌱
|
|||
|
date: 2024-10-21
|
|||
|
---
|
|||
|
Можно создать частичный индекс по условию, который покрывает только записи, удовлетворяющие определенному условию `WHERE`.
|
|||
|
|
|||
|
Например, можно исключить из индекса по внешнему ключу (FK) значения `NULL`:
|
|||
|
|
|||
|
```sql
|
|||
|
CREATE INDEX fk_not_null ON pgconf(fk_id)
|
|||
|
WHERE fk_id IS NOT NULL;
|
|||
|
```
|
|||
|
|
|||
|
При этом работа индекса не ускоряется, так как СУБД автоматически оптимизирует выполнение запроса. Однако, ==это позволит уменьшить размер индекса, что на больших объемах данных также может положительно сказаться на производительности.== Поиск в индексе размером 15 ГБ выполняется быстрее, чем в индексе на 200 ГБ.
|
|||
|
|
|||
|
**Преимущества:**
|
|||
|
- **Уменьшение размера индекса**: Индекс включает только необходимые записи, что уменьшает его общий объём.
|
|||
|
- **Ускорение запросов**: Частичный индекс может улучшить производительность запросов, особенно если он используется для выборки узко определённых данных.
|
|||
|
- **Оптимизация операций обновления**: Поскольку индекс обновляется только для определённых строк, уменьшаются накладные расходы на запись и обновление данных.
|
|||
|
|
|||
|
**Недостатки:**
|
|||
|
- **Ограниченная применимость**: Частичные индексы не всегда подходят, особенно для данных с высокой селективностью, где обычные индексы будут более эффективны.
|
|||
|
- **Сложность настройки**: Необходимо тщательно выбирать условия `WHERE`, чтобы получить максимальную пользу от частичного индекса. Неправильный выбор условий может привести к ухудшению производительности.
|
|||
|
|
|||
|
**Когда использовать частичные индексы:**
|
|||
|
- Когда необходимо уменьшить размер индекса за счёт исключения ненужных записей, что позволяет сэкономить место на диске и ускорить операции поиска.
|
|||
|
- Когда таблица содержит большое количество записей с одинаковыми значениями (низкая [[../Селективность колонки|селективность]]), и вам нужно индексировать только те записи, которые имеют уникальные или более специфичные значения.
|
|||
|
- В ситуациях, когда индекс нужен для работы с данными, которые соответствуют определённому условию, например, только "необработанные" записи.
|
|||
|
## Таблицы с колонкой статуса
|
|||
|
Часто в приложениях есть таблицы, которые содержат колонку статуса (`state`). Обычно статус разделяет записи на "обработанные" и "необработанные". Индекс нам часто нужен именно по необработанным данным. Создавая частичный индекс только по необработанным данным, мы можем ускорить выполнение запроса и уменьшить размер индекса.
|
|||
|
|
|||
|
Возьмем типичную табличку, в которой есть какие-то статусы мы хотим находить данные по этому статусу.
|
|||
|
|
|||
|
![300](../../../meta/files/images/Pasted%20image%2020240331095959.png)
|
|||
|
![600](../../../meta/files/images/Pasted%20image%2020240331100144.png)
|
|||
|
|
|||
|
Часто появляется желание сделать индекс по полю статуса:
|
|||
|
|
|||
|
![600](../../../meta/files/images/Снимок%20экрана%202024-03-31%20в%2010.07.02.png)
|
|||
|
|
|||
|
Но по факту мы индексируем поле, которое имеет небольшую [селективность](../../dev/database/Селективность%20колонки.md). Такой индекс не эффективный.
|
|||
|
|
|||
|
Хороший вариант в данном случае:
|
|||
|
![600](../../../meta/files/images/Снимок%20экрана%202024-03-31%20в%2010.13.39.png)
|
|||
|
|
|||
|
Почти идеальный:
|
|||
|
![600](../../../meta/files/images/Снимок%20экрана%202024-03-31%20в%2010.15.06.png)
|
|||
|
![500](../../../meta/files/images/Pasted%20image%2020240331101612.png)
|
|||
|
|
|||
|
Идеальный. Совмещаем и [[../../../dev/database/postgresql/Составной индекс в PostgreSQL|составной индекс]] и частичный.
|
|||
|
|
|||
|
![[../../../meta/files/images/Pasted image 20241021225124.png]]
|
|||
|
|
|||
|
|
|||
|
***
|
|||
|
## Мета информация
|
|||
|
**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]]
|
|||
|
**Родитель**:: [[Индекс в PostgreSQL]], [[Оптимизация SQL запросов в PostgreSQL]]
|
|||
|
**Источник**::
|
|||
|
**Создана**:: [[2024-10-21]]
|
|||
|
**Автор**::
|
|||
|
### Дополнительные материалы
|
|||
|
-
|
|||
|
|
|||
|
### Дочерние заметки
|
|||
|
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
|||
|
|