@pqgg7nwkd4

Возможен и полезен ли условный индекс без колонок?

Допустим у нас есть таблица с неотправленными сообщениями. Таблица большая, а неотправленных сообщений среди них мало.
Возможно ли что-то такое:
`CREATE INDEX messages0 ON messages WHERE NOT is_sent`
Я предполагаю, что БД при запросе `SELECT * FROM messages WHERE NOT is_sent` должна увидеть такой индекс и сделать запрос из него.

Если такой синтаксис недопустим, то будет ли сделать так:
`CREATE INDEX messages0 ON messages USING btree (is_sent) WHERE NOT is_sent`

Или как эффективно сделать?
  • Вопрос задан
  • 35 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA, рассмотрю предложения о работе
Синтаксически индекс не может быть из 0 колонок. Хоть что-то в индекс добавить придётся.

Планировщик может выбрать использовать частичный индекс если его префикс хорошо позволяет фильтровать выборку даже если поля в самом индексе для этого запроса вовсе не нужны. То есть для запроса
SELECT * FROM messages WHERE NOT is_sent
Одинаково подойдёт любой из:
CREATE INDEX messages0 ON messages USING btree (is_sent) WHERE NOT is_sent
CREATE INDEX messages0 ON messages USING btree ((true)) WHERE NOT is_sent
CREATE INDEX messages0 ON messages USING btree (id) WHERE NOT is_sent
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Swartalf
должно помочь, примеры посмотрите тут
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы