CREATE INDEX bookings_book_date_part_key
ON bookings ( book_date )
WHERE total_amount > 1000000;
CREATE INDEX
Повторим вышеприведенный запрос. Теперь он выдаст результат за время, на поря-
док меньшее, чем без использования частичного индекса.
В разделе документации 11.8 «Частичные индексы» сказано, что для того, чтобы
СУБД использовала частичный индекс, необходимо, чтобы условие, записанное в за-
просе в предложении WHERE, соответствовало предикату индекса. Это означает, что
249
Глава 8. Индексы
либо условие должно быть точно таким же, как использованное в предикате частич-
ного индекса при его создании, либо условие запроса должно математически сво-
диться к предикату индекса, а система должна суметь это понять. Например, в таком
запросе индекс будет использоваться:
SELECT *
FROM bookings
WHERE total_amount > 1100000 ...
А в таком не будет:
SELECT *
FROM bookings
WHERE total_amount > 900000 ...
Частичные индексы выглядят очень привлекательно, но в большинстве случаев их
преимущества по сравнению с обычными индексами будут минимальными (см. за-
дание 9). Однако размер частичного индекса будет меньше, чем размер обычного.
Для получения заметного полезного эффекта от их применения необходимы опыт и
понимание того, как работают индексы в PostgreSQL.
Контрольные вопросы и задания
1. Предположим, что для какой-то таблицы создан уникальный индекс по двум
столбцам: column1 и column2. В таблице есть строка, у которой значение ат-
рибута column1 равно ABC, а значение атрибута column2 — NULL. Мы решили
добавить в таблицу еще одну строку с такими же значениями ключевых атри-
бутов, т. е. column1 — ABC, а column2 — NULL.
Как вы думаете, будет ли операция вставки новой строки успешной или завер-
шится с ошибкой? Объясните ваше решение.
2. В тексте главы шла речь о выполнении одной и той же выборки из таблицы «Би-
леты» (tickets) при наличии индекса по столбцу passenger_name и при его
отсутствии. Вы видели, что наличие индекса ускоряет выполнение запроса по-
чти на порядок.
Если секундомер в утилите psql выключен, то включите его с помощью команды
\timing on
250
Контрольные вопросы и задания
Проведите следующий эксперимент: выполните этот запрос несколько раз под-
ряд при отсутствии индекса, а затем создайте индекс и опять выполните этот
запрос несколько раз подряд.
Достарыңызбен бөлісу: |