Compare commits
2 Commits
d5375652d0
...
d20df572a6
Author | SHA1 | Date | |
---|---|---|---|
d20df572a6 | |||
f7f3e26075 |
@ -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` - показывает индексы по которым мало чтения.
|
@ -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 -->
|
||||||
|
@ -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 -->
|
||||||
|
@ -18,7 +18,7 @@ date: 2024-10-21
|
|||||||
|
|
||||||
**Полезные советы:**
|
**Полезные советы:**
|
||||||
- [[../Селективность колонки|Селективность колонки]]: чем выше селективность, тем эффективнее работает индекс.
|
- [[../Селективность колонки|Селективность колонки]]: чем выше селективность, тем эффективнее работает индекс.
|
||||||
- **Частичные индексы**: используйте [[частичный индекс]], чтобы уменьшить размер индекса и повысить эффективность.
|
- **Частичные индексы**: используйте [[../Частичный индекс]], чтобы уменьшить размер индекса и повысить эффективность.
|
||||||
***
|
***
|
||||||
## Мета информация
|
## Мета информация
|
||||||
**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]]
|
**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]]
|
||||||
|
@ -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) означает, что данные отсортированы, что может существенно ускорить диапазонные запросы. В таких случаях планировщик может использовать последовательное сканирование, что может быть быстрее, чем случайное чтение.
|
||||||
***
|
***
|
||||||
|
@ -13,7 +13,7 @@ CREATE INDEX fk_not_null ON pgconf(fk_id)
|
|||||||
WHERE fk_id IS NOT NULL;
|
WHERE fk_id IS NOT NULL;
|
||||||
```
|
```
|
||||||
|
|
||||||
При этом работа индекса не ускоряется, так как СУБД автоматически оптимизирует выполнение запроса. Однако, ==это позволит уменьшить размер индекса, что на больших объемах данных также может положительно сказаться на производительности.== Поиск в индексе размером 15 ГБ выполняется быстрее, чем в индексе на 200 ГБ.
|
Частичные индексы позволяют не только уменьшить размер индекса, но и обеспечить более эффективную работу с таблицами, содержащими данные, которые имеют различный статус (например, активные и удаленные записи). Это особенно полезно в случаях, когда необходимо поддерживать уникальность данных и при этом исключить определенные записи из индекса, такие как удаленные или обработанные.
|
||||||
|
|
||||||
**Преимущества:**
|
**Преимущества:**
|
||||||
- **Уменьшение размера индекса**: Индекс включает только необходимые записи, что уменьшает его общий объём.
|
- **Уменьшение размера индекса**: Индекс включает только необходимые записи, что уменьшает его общий объём.
|
||||||
@ -26,37 +26,49 @@ WHERE fk_id IS NOT NULL;
|
|||||||
|
|
||||||
**Когда использовать частичные индексы:**
|
**Когда использовать частичные индексы:**
|
||||||
- Когда необходимо уменьшить размер индекса за счёт исключения ненужных записей, что позволяет сэкономить место на диске и ускорить операции поиска.
|
- Когда необходимо уменьшить размер индекса за счёт исключения ненужных записей, что позволяет сэкономить место на диске и ускорить операции поиска.
|
||||||
- Когда таблица содержит большое количество записей с одинаковыми значениями (низкая [[../Селективность колонки|селективность]]), и вам нужно индексировать только те записи, которые имеют уникальные или более специфичные значения.
|
- Когда таблица содержит большое количество записей с одинаковыми значениями (низкая [[Селективность колонки|селективность]]), и вам нужно индексировать только те записи, которые имеют уникальные или более специфичные значения.
|
||||||
- В ситуациях, когда индекс нужен для работы с данными, которые соответствуют определённому условию, например, только "необработанные" записи.
|
- В ситуациях, когда индекс нужен для работы с данными, которые соответствуют определённому условию, например, только "необработанные" записи.
|
||||||
## Таблицы с колонкой статуса
|
## Применение частичных индексов
|
||||||
|
### Таблицы с колонкой статуса
|
||||||
Часто в приложениях есть таблицы, которые содержат колонку статуса (`state`). Обычно статус разделяет записи на "обработанные" и "необработанные". Индекс нам часто нужен именно по необработанным данным. Создавая частичный индекс только по необработанным данным, мы можем ускорить выполнение запроса и уменьшить размер индекса.
|
Часто в приложениях есть таблицы, которые содержат колонку статуса (`state`). Обычно статус разделяет записи на "обработанные" и "необработанные". Индекс нам часто нужен именно по необработанным данным. Создавая частичный индекс только по необработанным данным, мы можем ускорить выполнение запроса и уменьшить размер индекса.
|
||||||
|
|
||||||
Возьмем типичную табличку, в которой есть какие-то статусы мы хотим находить данные по этому статусу.
|
Возьмем типичную табличку, в которой есть какие-то статусы мы хотим находить данные по этому статусу.
|
||||||
|
|
||||||
![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`, и они также остаются в базе данных. В такой ситуации создание уникального индекса на поле с электронной почтой становится невозможным из-за дублирующихся значений. Частичный индекс решает эту проблему, позволяя включать в индекс только записи, которые не помечены как удаленные.
|
||||||
|
|
||||||
|
В PostgreSQL добавление уникального индекса для активных пользователей выглядит так:
|
||||||
|
```sql
|
||||||
|
CREATE UNIQUE INDEX users_email_uniq ON users (
|
||||||
|
email
|
||||||
|
) WHERE deleted_at IS NULL;
|
||||||
|
```
|
||||||
|
|
||||||
|
В этом случае строки, у которых `deleted_at` не задан, включаются в индекс, а остальные игнорируются, что делает индекс более компактным и эффективным.
|
||||||
|
|
||||||
***
|
***
|
||||||
## Мета информация
|
## Мета информация
|
||||||
**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]]
|
**Область**:: [[../../meta/zero/00 PostgreSQL|00 PostgreSQL]]
|
||||||
**Родитель**:: [[Индекс в PostgreSQL]], [[Оптимизация SQL запросов в PostgreSQL]]
|
**Родитель**:: [[Индекс в PostgreSQL]], [[Оптимизация SQL запросов в PostgreSQL]]
|
||||||
**Источник**::
|
**Источник**::
|
||||||
**Создана**:: [[2024-10-21]]
|
**Создана**:: [[2024-10-21]]
|
@ -5,14 +5,15 @@ aliases:
|
|||||||
tags:
|
tags:
|
||||||
- maturity/🌱
|
- maturity/🌱
|
||||||
date: 2024-10-19
|
date: 2024-10-19
|
||||||
zero-link:
|
|
||||||
parents:
|
|
||||||
linked:
|
|
||||||
---
|
---
|
||||||
- Логические: boolean - true, false
|
- Логические: boolean
|
||||||
- Целочисленные: byte, short, int, long - 42, -1
|
- Целочисленные: byte, short, int, long
|
||||||
- Дробные: float, double - 3.141, NaN
|
- Дробные: float, double
|
||||||
- Символьные (UTF-16): CHAR
|
- Символьные (UTF-16): CHAR
|
||||||
|
|
||||||
|
![[../../meta/files/images/Pasted image 20241030215828.png]]
|
||||||
|
![[../../meta/files/images/Pasted image 20241030223908.png]]
|
||||||
|
|
||||||
***
|
***
|
||||||
## Мета информация
|
## Мета информация
|
||||||
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
|
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
|
||||||
|
64
dev/java/Странности в Java.md
Normal file
64
dev/java/Странности в Java.md
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
---
|
||||||
|
aliases:
|
||||||
|
- polygenelubricants
|
||||||
|
tags:
|
||||||
|
- maturity/🌱
|
||||||
|
date: 2024-10-30
|
||||||
|
---
|
||||||
|
## Арифметические
|
||||||
|
### Отсутствие переполнения
|
||||||
|
```java
|
||||||
|
System.out.println(-Integer.MIN_VALUE) // -2147483648
|
||||||
|
```
|
||||||
|
|
||||||
|
Можно использовать `Math.negateExact()`, чтобы получить исключение
|
||||||
|
|
||||||
|
```java
|
||||||
|
Math.negateExact(Integer.MIN_VALUE)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Абсолютное значение
|
||||||
|
```java
|
||||||
|
Math.abs(-Integer.MIN_VALUE) // -2147483648
|
||||||
|
```
|
||||||
|
|
||||||
|
### Character
|
||||||
|
```java
|
||||||
|
System.out.println(Character.isDigit('⑤')); // false
|
||||||
|
System.out.println(Character.getNumericValue('⑤') == 5); // true
|
||||||
|
```
|
||||||
|
## Прочее
|
||||||
|
### polygenelubricants
|
||||||
|
```java
|
||||||
|
System.out.println("polygenelubricants".hashCode()); // Integer.MIN_VALUE
|
||||||
|
```
|
||||||
|
###
|
||||||
|
```java
|
||||||
|
class Hello {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// Безобидный комментарий \u000a System.out.println("Bugaga") ;
|
||||||
|
System.out.println("Hello World");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Sout:
|
||||||
|
```
|
||||||
|
Bugaga
|
||||||
|
Hello World
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
***
|
||||||
|
## Мета информация
|
||||||
|
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
|
||||||
|
**Родитель**::
|
||||||
|
**Источник**::
|
||||||
|
**Создана**:: [[2024-10-30]]
|
||||||
|
**Автор**::
|
||||||
|
### Дополнительные материалы
|
||||||
|
-
|
||||||
|
|
||||||
|
### Дочерние заметки
|
||||||
|
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||||
|
|
BIN
meta/files/images/Pasted image 20241030215828.png
Normal file
BIN
meta/files/images/Pasted image 20241030215828.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 MiB |
BIN
meta/files/images/Pasted image 20241030223908.png
Normal file
BIN
meta/files/images/Pasted image 20241030223908.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.0 MiB |
BIN
meta/files/images/comp/Pasted image 20241030215828.png
Normal file
BIN
meta/files/images/comp/Pasted image 20241030215828.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 391 KiB |
@ -0,0 +1 @@
|
|||||||
|
87bc6f0c0cfed20b67d085315d75636e
|
BIN
meta/files/images/comp/Pasted image 20241030223908.png
Normal file
BIN
meta/files/images/comp/Pasted image 20241030223908.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 288 KiB |
@ -0,0 +1 @@
|
|||||||
|
31257abc8a66311c9afce7039693323c
|
BIN
meta/files/images/webp/Pasted image 20241030215828.webp
Normal file
BIN
meta/files/images/webp/Pasted image 20241030215828.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 138 KiB |
@ -0,0 +1 @@
|
|||||||
|
87bc6f0c0cfed20b67d085315d75636e
|
BIN
meta/files/images/webp/Pasted image 20241030223908.webp
Normal file
BIN
meta/files/images/webp/Pasted image 20241030223908.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 94 KiB |
@ -0,0 +1 @@
|
|||||||
|
31257abc8a66311c9afce7039693323c
|
@ -28,6 +28,7 @@ title: Java разработка
|
|||||||
- [[../../dev/java/Примитивный тип|Примитивный тип]]
|
- [[../../dev/java/Примитивный тип|Примитивный тип]]
|
||||||
- [[../../dev/java/Ссылочный тип|Ссылочный тип]]
|
- [[../../dev/java/Ссылочный тип|Ссылочный тип]]
|
||||||
- [[../../dev/java/Передача значений в метод в Java|Передача значений в метод в Java]]
|
- [[../../dev/java/Передача значений в метод в Java|Передача значений в метод в Java]]
|
||||||
|
- [[../../dev/java/Странности в Java|Странности в Java]]
|
||||||
## Версии Java
|
## Версии Java
|
||||||
- [[Java 1]]
|
- [[Java 1]]
|
||||||
- [Java 7](Java%207.md)
|
- [Java 7](Java%207.md)
|
||||||
|
@ -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]]
|
||||||
### Онлайн статистика
|
### Онлайн статистика
|
||||||
|
Loading…
Reference in New Issue
Block a user