Postgres: индекс по нескольким столбцам с другим ведущим столбцом

Jie Hu спросил: 26 ноября 2017 в 05:07 в: postgresql

У меня есть два индекса из двух столбцов:

create index idx_film_length_rating on film (length, rating);
create index idx_film_rating_length on film (rating, length);

Когда я выполняю:

explain analyze select title, length, rating, replacement_cost, rental_rate
from film
where rating = 'G' and length between 60 and 70

Postgres считает idx_film_rating_length всегда лучший вариант, и используйте этот индекс. Но почему, если нет второго индекса, idx_film_rating_length, запрос будет работать медленнее? Насколько я понимаю, планы выполнения одинаковы, блоки извлечения одинаковы, они должны быть одинаковыми.

Результат только с одним индексом:

"Bitmap Heap Scan on film  (cost=4.44..35.70 rows=13 width=34) (actual time=0.102..0.120 rows=18 loops=1)"
"  Recheck Cond: ((rating = 'G'::mpaa_rating) AND (length >= 60) AND (length <= 70))"
"  Heap Blocks: exact=14"
"  ->  Bitmap Index Scan on idx_film_rating_length  (cost=0.00..4.44 rows=13 width=0) (actual time=0.095..0.095 rows=18 loops=1)"
"        Index Cond: ((rating = 'G'::mpaa_rating) AND (length >= 60) AND (length <= 70))"
"Planning time: 0.316 ms"
"Execution time: 0.160 ms"

И приведите два индекса в таблице:

"Bitmap Heap Scan on film  (cost=4.44..35.70 rows=13 width=34) (actual time=0.030..0.041 rows=18 loops=1)"
"  Recheck Cond: ((rating = 'G'::mpaa_rating) AND (length >= 60) AND (length <= 70))"
"  Heap Blocks: exact=14"
"  ->  Bitmap Index Scan on idx_film_rating_length  (cost=0.00..4.44 rows=13 width=0) (actual time=0.024..0.024 rows=18 loops=1)"
"        Index Cond: ((rating = 'G'::mpaa_rating) AND (length >= 60) AND (length <= 70))"
"Planning time: 0.199 ms"
"Execution time: 0.065 ms"

Хотя планы одинаковые, второй работает быстрее.

== ==================================== Рекомендовано @a_horse_with_no_nameAfter добавить буферы и подробности:

"Bitmap Heap Scan on film  (cost=4.44..35.70 rows=13 width=34) (actual time=0.692..0.716 rows=18 loops=1)"
"  Recheck Cond: ((rating = 'G'::mpaa_rating) AND (length >= 60) AND (length <= 70))"
"  Heap Blocks: exact=14"
"  Buffers: shared hit=14 read=2"
"  ->  Bitmap Index Scan on idx_film_cover  (cost=0.00..4.44 rows=13 width=0) (actual time=0.680..0.680 rows=18 loops=1)"
"        Index Cond: ((rating = 'G'::mpaa_rating) AND (length >= 60) AND (length <= 70))"
"        Buffers: shared read=2"
"Planning time: 1.773 ms"
"Execution time: 1.441 ms"

Возможно, проблема связана с:"Buffers: shared hit = 14 read = 2"?

0 ответов