b.
a LIKE 'text%' - фулскан
А вообще я хотел потом написать order by a, b, и чтобы быстро работало
Да, работает. Но только если Вы правильно создали индекс (collation и т.п.) — см. https://www.postgresql.org/docs/current/indexes-opclass.html
Like не входит в индексные операторы. Используйте substring(a,1, 4)='text' или похожие
Что такое collation пока не вкурил, а вот добавление text_pattern_ops вроде помогло пока что. Вчитаюсь и поэкспериментирую, спасибо.
Некоторые его виды (вроде показанного a LIKE 'text%') — входят. А вот это substring(a,1, 4)='text' как раз без функционального индекса работать не будет.
Похоже, что если использовать индекс вида (a text_pattern_ops, b), то сортировать по a, b PG потом не сможет. Никто не знает, есть ли варианты реализовать такое? Чтобы сделать быстрый поиск по a LIKE и потом order by a, b
Не сможет, конечно (каким образом это было бы возможно технически?) — дело, опять-таки, в collation. Грубо говоря, подобные запросы (WHERE col1 LIKE 'a%' ORDER BY col1, col2) — это, фактически, что-то вроде: WHERE col1 >= 'a' COLLATE "C" AND col1 < 'b' COLLATE "C" ORDER BY col1 COLLATE "ru_RU.utf8", col2 Естественно, один индекс не может обеспечить сразу две разные сортировки. Так что либо поиск, либо сортировку тут придётся выполнять без помощи индекса.
На самом деле если сделать просто CREATE INDEX ... (a COLLATE "C"), а потом в выборке LIKE ... и ORDER BY COLLATE "C" -- то работать будет по одному индэксу.
@tzirechnoy, спасибо, вот это многое проясняет
Обсуждают сегодня