Обратите внимание, что первая оценка стоимости в плане — не нулевая. Это объяс-
няется тем, что, хотя индекс уже упорядочен, и дополнительная сортировка не требу-
ется, но для того, чтобы найти в индексе первую строку в соответствии с требуемым
порядком, тоже нужно некоторое время.
Если к сортировке добавить еще и условие отбора строк, то это отразится в дополни-
тельной строке верхнего (и единственного) узла плана.
EXPLAIN
SELECT * FROM bookings
WHERE book_ref > '0000FF' AND book_ref < '000FFF'
ORDER BY book_ref;
QUERY PLAN
----------------------------------------------------------------
Index Scan using bookings_pkey on bookings (cost=0.42..9.50 rows=54
width=21)
,
→
Index Cond: ((book_ref > '0000FF'::bpchar) AND (book_ref <
'000FFF'::bpchar))
,
→
(2 строки)
Обратите внимание, что поскольку столбец, по которому производится отбор строк,
является индексируемым, то их отбор реализуется не через Filter, а через Index
Cond.
Теперь проиллюстрируем метод
сканирования на основе битовой карты
на при-
мере таблицы «Места» (seats).
EXPLAIN SELECT * FROM seats WHERE aircraft_code = 'SU9';
QUERY PLAN
----------------------------------------------------------------
Bitmap Heap Scan on seats (cost=5.03..14.24 rows=97 width=15)
Recheck Cond: (aircraft_code = 'SU9'::bpchar)
-> Bitmap Index Scan on seats_pkey (cost=0.00..5.00 rows=97 width=0)
Index Cond: (aircraft_code = 'SU9'::bpchar)
(4 строки)
В этом плане в нижнем узле строится битовая карта, а в верхнем узле с помощью
этой карты сканируются страницы таблицы seats. Здесь также для отбора строк в
соответствии с предложением WHERE используется индекс — Index Cond. Обратите
внимание, что значение параметра width при создании битовой карты равно нулю,
поскольку сами строки на этом этапе еще не выбираются.
Если нам будет нужно выбрать только номера бронирований в каком-то диапазоне,
то обращения к таблице не потребуется: достаточно
Достарыңызбен бөлісу: