Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
13.04.2021, 16:37
|
|||
---|---|---|---|
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Есть таблица связей tbl ( main_id int8, rel_id int8, flag bool) Есть покрывающие индексы mr_idx (main_id, rel_id) и rfm_idx (rel_id, flag, main_id) Выполняем запрос: Код: sql 1. 2. 3. 4. 5. 6. 7.
Здесь всё нормально: используется только индекс mr_idx , записи не читаются. Выполняем противоположный запрос с задействованием поля "flag": Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А вот здесь PostgreSQL почему-то лезет в Heap, хотя индекс rfm_idx тоже покрывающий. Вопросы : 1) Если в Heap он лезет из-за необходимости перепроверки условия, то почему возникает необходимость перепроверки ? Как видно из плана, heap blocks lossy = 0 . 2) Если перепроверка условия не выполняется, тогда зачем он лезет в Heap ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 17:03
|
|||
---|---|---|---|
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Cyrax_02Как видно из плана, heap blocks lossy = 0Впрочем, exact/lossy здесь вообще влиять ни на что не должны, т.к. индексы покрывающие. Даже при (heap blocks lossy > 0) всё равно он не должен лезть в heap... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 17:29
|
|||
---|---|---|---|
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Cyrax_02 Heap Fetches: 2 Здесь всё нормально: используется только индекс mr_idx , записи не читаются. Вам рассказать, что вы заблуждаетесь с самого начала? За обеими строками сходили в таблицу перепроверить видимость для текущей транзакции. Index Only Scan - это не отсутствие обращения к heap, а возможность не обращаться к heap при некоторых условиях. В частности, если visibility map разрешит. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 18:18
|
|||
---|---|---|---|
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
MelkijЗа обеими строками сходили в таблицу перепроверить видимость для текущей транзакцииТ.е. поход в таблицу за перепроверкой условия сопровождается строкой " Bitmap Heap Scan ", А поход в таблицу за проверкой существования строки для текущей транзакции сопровождается строкой " Heap Fetches " Так? А если так, почему во втором случае (тоже покрывающий индекс) он идёт в таблицу за перепроверкой условия ? Максимум он мог бы сходить за проверкой видимости для транзакции... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 20:04
|
|||
---|---|---|---|
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Если выполнить Код: sql 1.
то оба запроса дают нормальный план: Index Only Scan + Heap Fetches: 0 (в таблицу не лезет) Но если выполнить Код: sql 1.
то для первого запроса получаем Index Only Scan + Heap Fetches: 2 (полез в таблицу) для второго запроса получаем Bitmap Index Scan + Bitmap Heap Scan (застрял в таблице со всеми потрохами) Вопросы : 1) Почему VACUUM FULL делает visibility map неактуальной ? 2) Почему во втором запросе он лезет в таблицу ? Причём не для проверки видимости в транзакции, а по какой-то иной нужде. Что он там забыл ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 20:10
|
|||
---|---|---|---|
|
|||
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Cyrax_02 Если выполнить Код: sql 1.
то оба запроса дают нормальный план: Index Only Scan + Heap Fetches: 0 (в таблицу не лезет) Но если выполнить Код: sql 1.
то для первого запроса получаем Index Only Scan + Heap Fetches: 2 (полез в таблицу) для второго запроса получаем Bitmap Index Scan + Bitmap Heap Scan (застрял в таблице со всеми потрохами) Вопросы : 1) Почему VACUUM FULL делает visibility map неактуальной ? 2) Почему во втором запросе он лезет в таблицу ? Причём не для проверки видимости в транзакции, а по какой-то иной нужде. Что он там забыл ? 1)потому что он с нуля перестраивает таблицу и visibility map теряется скорее всего (не сюрприз) 2)потому что bitmap scan не умеет index only вообще... т.е. bitmap scan ВСЕГДА будет данные таблицы читать. PS: это уже уровень вопросов на которые лучший ответ будет - посмотрите в исходниках если вы в такие детали влезаете. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 21:26
|
|||
---|---|---|---|
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
автор1)потому что он с нуля перестраивает таблицу и visibility map теряется скорее всего (не сюрприз)Такое поведение больше похоже на ошибку в реализации команды VACUUM FULL . При выполнении VACUUM visibility map актуализируется (как и должно быть), а при выполнении VACUUM FULL после пересоздания таблицы visibility map не актуализируется. Явно, пробел в реализации... автор2)потому что bitmap scan не умеет index only вообще... т.е. bitmap scan ВСЕГДА будет данные таблицы читать.Так вопрос в том, почему для 2-го запроса при неактуальном visibility map запускается Bitmap scan вместо Index Only Scan / Heap Fetches=2 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 21:30
|
|||
---|---|---|---|
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
В РБД слабым звеном по части производительности являются таблицы связей и если покрывающие индексы на этих таблицах не выполняют свою основную функцию, естественным образом возникают сабжевые вопросы... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 22:14
|
|||
---|---|---|---|
|
|||
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Cyrax_02 автор2)потому что bitmap scan не умеет index only вообще... т.е. bitmap scan ВСЕГДА будет данные таблицы читать. А вот с этим уже можно и разбираться... выбор действительно странный... покажите 1)размеры таблицы и обоих индексов 2)количество строк в таблице PS: любое performance тестирование имеет смысл делать на таблицах от 100 страниц и 100.000 строк иначе там планы могут быть странные хотя и быстрые. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 22:21
|
|||
---|---|---|---|
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Maxim BogukCyrax_02Так вопрос в том, почему для 2-го запроса при неактуальном visibility map запускается Bitmap scan вместо Index Only Scan / Heap Fetches=2 А вот с этим уже можно и поразбиратся... выбор действительно странный... покажите 1)размеры таблицы и обоих индексов 2)количество строк в таблице PS: любое performance тестирование имеет смысл делать на таблицах от 100 страниц и 100.000 строк иначе там планы могут быть странные хотя и быстрые. Таблица маленькая: 8000 строк, индексы 192К и 264К, work_mem = 64M ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 22:26
|
|||
---|---|---|---|
|
|||
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Cyrax_02 Maxim Bogukпропущено... А вот с этим уже можно и поразбиратся... выбор действительно странный... покажите 1)размеры таблицы и обоих индексов 2)количество строк в таблице PS: любое performance тестирование имеет смысл делать на таблицах от 100 страниц и 100.000 строк иначе там планы могут быть странные хотя и быстрые. Таблица маленькая: 8000 строк, индексы 192К и 264К, work_mem = 64M Ну вот сделайте раз в 100 побольше и тестируйте наздоровье. Или отключите bitmap scan на текущих запросах и сравните время с ним и без него... если время близкое или bitmap scan быстрее - выбор базы вполне оправдан. Если посмотреть на два начальных запроса то скорость работы у них фактически одинакова... bitmap scan даже немного быстрее в расчете на 1 строку результата. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 22:43
|
|||
---|---|---|---|
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Maxim Bogukесли ... - выбор базы вполне оправдан... А разве Bitmap scan (Bitmap Index Scan + Bitmap Heap Scan) может быть быстрее Index Only Scan / Heap Fetches ?? Если нет, то выбор плана выполнения объясняется не соображениями скорости... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 23:04
|
|||
---|---|---|---|
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Ещё такой вопрос: в первом посте план запроса содержит строку " Index Only Scan " - здесь всё понятно. (1) А что означает просто " Index Scan " (без Only) ?? Вот пример такого плана (без filter): Код: sql 1. 2. 3. 4. 5. 6. 7.
И ещё пример (с filter): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
(2) Здесь непонятно, как производится фильтрация ( filter ) - на основе другого индекса (который содержит нужные поля - есть такой в таблице), или лезет в таблицу (тогда почему не упоминается heap ?) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 23:10
|
|||
---|---|---|---|
|
|||
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Cyrax_02 Ещё такой вопрос: в первом посте план запроса содержит строку " Index Only Scan " - здесь всё понятно. (1) А что означает просто " Index Scan " (без Only) ?? Вот пример такого плана (без filter): Код: sql 1. 2. 3. 4. 5. 6. 7.
И ещё пример (с filter): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
(2) Здесь непонятно, как производится фильтрация ( filter ) - на основе другого индекса (который содержит нужные поля - есть такой в таблице), или лезет в таблицу (тогда почему не упоминается heap ?) Index scan - результаты вам отдаются из ТАБЛИЦЫ а не из индекса напрямую. filter - фильтрация результатов по данным из ТАБЛИЦЫ heap не упоминается потому что он имеет смысл только для IOS/bitmap scan... в остальных случаях heap = rows+Rows Removed by Filter и как то специально его показывать смысла нет. за сим я сей тред покидаю. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.04.2021, 23:12
|
|||
---|---|---|---|
|
|||
PostgreSQL с покрывающим индексом лезет в HEAP (heap blocks lossy = 0)... |
|||
#18+
Cyrax_02 Maxim Bogukесли ... - выбор базы вполне оправдан... А разве Bitmap scan (Bitmap Index Scan + Bitmap Heap Scan) может быть быстрее Index Only Scan / Heap Fetches ?? Если нет, то выбор плана выполнения объясняется не соображениями скорости... может конечно иначе бы этот механизм бы не делали вообще. особенно на механических дисках - так вообще на раз потому что он последовательное более менее чтение дает в таблицы в отличии от index scan/ios. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=53&mobile=1&tid=1994084]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 140ms |
0 / 0 |