Индекс покрытия в Postgres 12

#postgresql #optimization #indexing

#postgresql #оптимизация #индексирование

Вопрос:

В моей таблице содержится 5500000 тестовых записей (Postgres 12). У меня есть неопределенность из-за больших затрат, когда я использую индекс покрытия в своих таблицах.

Итак, я создаю индекс:

 create index concurrently idx_log_type
    on logs (log_type)
    include (log_body);
 

После того, как я выполню запрос:

 explain (analyze)
select log_body
from logs where log_type = 1
limit 100;
 

Я получаю результат:

 Limit  (cost=0.43..5.05 rows=100 width=33) (actual time=0.118..0.138 rows=100 loops=1)
    - ->  Index Only Scan using idx_log_type on logs  (cost=0.43..125736.10 rows=2720667 width=33) (actual time=0.107..0.118 rows=100 loops=1)
        Index Cond: (log_type = 1)
        Heap Fetches: 0
Planning Time: 0.558 ms
Execution Time: 0.228 ms
 

На первый взгляд, это так хорошо, но диапазон затрат очень велик.
Это нормально или вы должны оптимизировать?

Ответ №1:

Это артефакт EXPLAIN : он показывает стоимость полного индексного сканирования, как если бы их не LIMIT было. Но весь план рассчитан правильно.

Таким образом, вы можете игнорировать высокий верхний предел стоимости при индексном сканировании.

Комментарии:

1. Спасибо, что разъяснили это. Я видел это раньше и не был уверен в верхнем значении стоимости.

2. @laurenz-albe, спасибо за пояснительный комментарий