Частичный индекс.md
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Struchkov Mark 2024-10-31 18:45:22 +03:00
parent f7f3e26075
commit d20df572a6
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
7 changed files with 25 additions and 25 deletions

View File

@ -11,5 +11,5 @@ linked:
- global_reports - global_reports
- `top_tables.sql` - покажет размер таблиц и размер индексов на них. Нужно обратить внимания на таблицы, размер индексов которых приближается к размеру таблицы или больше его. - `top_tables.sql` - покажет размер таблиц и размер индексов на них. Нужно обратить внимания на таблицы, размер индексов которых приближается к размеру таблицы или больше его.
- `indexes_with_nulls.sql` - позволяет найти индексы, которые содержат множество null значений. Их можно пересоздать в виде [[Частичный индекс|частичных индексов]]. - `indexes_with_nulls.sql` - позволяет найти индексы, которые содержат множество null значений. Их можно пересоздать в виде [[../Частичный индекс|частичных индексов]].
- `low_used_indexes.sql` - показывает индексы по которым мало чтения. - `low_used_indexes.sql` - показывает индексы по которым мало чтения.

View File

@ -12,7 +12,7 @@ date: 2024-03-31
- **Распухание индексов** (bloat) — это проблема увеличения размера индексов со временем, требующая переиндексации. - **Распухание индексов** (bloat) — это проблема увеличения размера индексов со временем, требующая переиндексации.
- [[Создание индекса в PostgreSQL]] - [[Создание индекса в PostgreSQL]]
- [[Частичный индекс]] - [[../Частичный индекс]]
- [[Составной индекс в PostgreSQL]] - [[Составной индекс в PostgreSQL]]
**Типы индексов:** **Типы индексов:**
@ -37,13 +37,13 @@ date: 2024-03-31
### Дочерние заметки ### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) --> <!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) --> <!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[Создание индекса в PostgreSQL]]
- [[Частичный индекс]]
- [[Составной индекс в PostgreSQL]]
- [[B-tree индекс в PostgreSQL]] - [[B-tree индекс в PostgreSQL]]
- [[Hash индекс в PostgreSQL]]
- [[Gist индекс в PostgreSQL]]
- [[SP-GiST индекс в PostgreSQL]]
- [[GIN индекс в PostgreSQL]]
- [[BRIN индекс в PostgreSQL]] - [[BRIN индекс в PostgreSQL]]
- [[GIN индекс в PostgreSQL]]
- [[Gist индекс в PostgreSQL]]
- [[Hash индекс в PostgreSQL]]
- [[SP-GiST индекс в PostgreSQL]]
- [[Создание индекса в PostgreSQL]]
- [[Составной индекс в PostgreSQL]]
- [[Частичный индекс]]
<!-- SerializedQuery END --> <!-- SerializedQuery END -->

View File

@ -51,9 +51,9 @@ select relname, seq_scan, idx_scan, vacuum_count from pg_stat_user_tables
### Дочерние заметки ### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) --> <!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) --> <!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[pageinspect]]
- [[pg_stat_statements]]
- [[Профилирование запросов в PostgreSQL]]
- [[Таблица статистик pg_stats]] - [[Таблица статистик pg_stats]]
- [[Частичный индекс]] - [[Частичный индекс]]
- [[pageinspect]]
- [[Профилирование запросов в PostgreSQL]]
- [[pg_stat_statements]]
<!-- SerializedQuery END --> <!-- SerializedQuery END -->

View File

@ -18,7 +18,7 @@ date: 2024-10-21
**Полезные советы:** **Полезные советы:**
- [[../Селективность колонки|Селективность колонки]]: чем выше селективность, тем эффективнее работает индекс. - [[../Селективность колонки|Селективность колонки]]: чем выше селективность, тем эффективнее работает индекс.
- **Частичные индексы**: используйте [[частичный индекс]], чтобы уменьшить размер индекса и повысить эффективность. - **Частичные индексы**: используйте [[../Частичный индекс]], чтобы уменьшить размер индекса и повысить эффективность.
*** ***
## Мета информация ## Мета информация
**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]] **Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]]

View File

@ -22,7 +22,7 @@ SELECT * FROM pg_stats WHERE tablename = 'your_table_name' AND attname = 'column
> [!WARNING] > [!WARNING]
> Данные в `pg_stats` основаны на выборке, и поэтому могут не всегда точно отражать реальное состояние таблицы, особенно если данные часто изменяются. Для более точной оценки можно увеличить выборку строк с помощью настройки статистики > Данные в `pg_stats` основаны на выборке, и поэтому могут не всегда точно отражать реальное состояние таблицы, особенно если данные часто изменяются. Для более точной оценки можно увеличить выборку строк с помощью настройки статистики
## Советы по анализу ## Советы по анализу
- При большом значении `null_frac` остальные параметры могут иметь меньшее значение. На основе этой информации можно уменьшить размер индекса, создав [[Частичный индекс]]. - При большом значении `null_frac` остальные параметры могут иметь меньшее значение. На основе этой информации можно уменьшить размер индекса, создав [[../Частичный индекс]].
- Если `n_distinct` показывает низкую уникальность, возможно, индекс на этой колонке не принесет значительного ускорения, так как слишком много строк имеют одинаковые значения (Низкая [[../Селективность колонки|селективность]]). В таком случае стоит рассмотреть пересмотр структуры запроса или таблицы. - Если `n_distinct` показывает низкую уникальность, возможно, индекс на этой колонке не принесет значительного ускорения, так как слишком много строк имеют одинаковые значения (Низкая [[../Селективность колонки|селективность]]). В таком случае стоит рассмотреть пересмотр структуры запроса или таблицы.
- Высокое значение `correlation` (близкое к 1 или -1) означает, что данные отсортированы, что может существенно ускорить диапазонные запросы. В таких случаях планировщик может использовать последовательное сканирование, что может быть быстрее, чем случайное чтение. - Высокое значение `correlation` (близкое к 1 или -1) означает, что данные отсортированы, что может существенно ускорить диапазонные запросы. В таких случаях планировщик может использовать последовательное сканирование, что может быть быстрее, чем случайное чтение.
*** ***

View File

@ -26,7 +26,7 @@ WHERE fk_id IS NOT NULL;
**Когда использовать частичные индексы:** **Когда использовать частичные индексы:**
- Когда необходимо уменьшить размер индекса за счёт исключения ненужных записей, что позволяет сэкономить место на диске и ускорить операции поиска. - Когда необходимо уменьшить размер индекса за счёт исключения ненужных записей, что позволяет сэкономить место на диске и ускорить операции поиска.
- Когда таблица содержит большое количество записей с одинаковыми значениями (низкая [[../Селективность колонки|селективность]]), и вам нужно индексировать только те записи, которые имеют уникальные или более специфичные значения. - Когда таблица содержит большое количество записей с одинаковыми значениями (низкая [[Селективность колонки|селективность]]), и вам нужно индексировать только те записи, которые имеют уникальные или более специфичные значения.
- В ситуациях, когда индекс нужен для работы с данными, которые соответствуют определённому условию, например, только "необработанные" записи. - В ситуациях, когда индекс нужен для работы с данными, которые соответствуют определённому условию, например, только "необработанные" записи.
## Применение частичных индексов ## Применение частичных индексов
### Таблицы с колонкой статуса ### Таблицы с колонкой статуса
@ -34,25 +34,25 @@ WHERE fk_id IS NOT NULL;
Возьмем типичную табличку, в которой есть какие-то статусы мы хотим находить данные по этому статусу. Возьмем типичную табличку, в которой есть какие-то статусы мы хотим находить данные по этому статусу.
![300](../../../meta/files/images/Pasted%20image%2020240331095959.png) ![300](../../meta/files/images/Pasted%20image%2020240331095959.png)
![600](../../../meta/files/images/Pasted%20image%2020240331100144.png) ![600](../../meta/files/images/Pasted%20image%2020240331100144.png)
Часто появляется желание сделать индекс по полю статуса: Часто появляется желание сделать индекс по полю статуса:
![600](../../../meta/files/images/Снимок%20экрана%202024-03-31%20в%2010.07.02.png) ![600](../../meta/files/images/Снимок%20экрана%202024-03-31%20в%2010.07.02.png)
Но по факту мы индексируем поле, которое имеет небольшую [селективность](../../dev/database/Селективность%20колонки.md). Такой индекс не эффективный. Но по факту мы индексируем поле, которое имеет небольшую [селективность](../../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.13.39.png)
Почти идеальный: Почти идеальный:
![600](../../../meta/files/images/Снимок%20экрана%202024-03-31%20в%2010.15.06.png) ![600](../../meta/files/images/Снимок%20экрана%202024-03-31%20в%2010.15.06.png)
![500](../../../meta/files/images/Pasted%20image%2020240331101612.png) ![500](../../meta/files/images/Pasted%20image%2020240331101612.png)
Идеальный. Совмещаем и [[../../../dev/database/postgresql/Составной индекс в PostgreSQL|составной индекс]] и частичный. Идеальный. Совмещаем и [[postgresql/Составной индекс в PostgreSQL|составной индекс]] и частичный.
![[../../../meta/files/images/Pasted image 20241021225124.png]] ![[../../meta/files/images/Pasted image 20241021225124.png]]
### Для мягкого удаления ### Для мягкого удаления
Представьте, что вам нужно поддерживать уникальность данных, например, адресов электронной почты в таблице базы данных. Однако в таблице есть строки, [[../../../../../_inbox/Tombstone|помеченные как удаленные]] с помощью поля `deleted_at`, и они также остаются в базе данных. В такой ситуации создание уникального индекса на поле с электронной почтой становится невозможным из-за дублирующихся значений. Частичный индекс решает эту проблему, позволяя включать в индекс только записи, которые не помечены как удаленные. Представьте, что вам нужно поддерживать уникальность данных, например, адресов электронной почты в таблице базы данных. Однако в таблице есть строки, [[../../../../../_inbox/Tombstone|помеченные как удаленные]] с помощью поля `deleted_at`, и они также остаются в базе данных. В такой ситуации создание уникального индекса на поле с электронной почтой становится невозможным из-за дублирующихся значений. Частичный индекс решает эту проблему, позволяя включать в индекс только записи, которые не помечены как удаленные.
@ -68,7 +68,7 @@ CREATE UNIQUE INDEX users_email_uniq ON users (
*** ***
## Мета информация ## Мета информация
**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]] **Область**:: [[../../meta/zero/00 PostgreSQL|00 PostgreSQL]]
**Родитель**:: [[Индекс в PostgreSQL]], [[Оптимизация SQL запросов в PostgreSQL]] **Родитель**:: [[Индекс в PostgreSQL]], [[Оптимизация SQL запросов в PostgreSQL]]
**Источник**:: **Источник**::
**Создана**:: [[2024-10-21]] **Создана**:: [[2024-10-21]]

View File

@ -107,7 +107,7 @@ date: 2022-10-14
![500](../../meta/files/images/Pasted%20image%2020240331101612.png) ![500](../../meta/files/images/Pasted%20image%2020240331101612.png)
Идеальный. Совмещаем и [[../../dev/database/postgresql/Составной индекс в PostgreSQL|составной индекс]] и [[../../dev/database/postgresql/Частичный индекс|Частичный индекс]] Идеальный. Совмещаем и [[../../dev/database/postgresql/Составной индекс в PostgreSQL|составной индекс]] и [[../../dev/database/Частичный индекс|Частичный индекс]]
![[../../meta/files/images/Pasted image 20241021225124.png]] ![[../../meta/files/images/Pasted image 20241021225124.png]]
### Онлайн статистика ### Онлайн статистика