При использовании локалей, отличных от C
(т. е. POSIX
), вам необходимо создать свои индексы для поиска текста с префиксами LIKE
и ~
с использованием класса операции text_pattern_ops
. См. документацию по классам операторов и типы индексов. Я уверен, что есть лучшая ссылка, чем эта страница документации, но я не могу найти ее в данный момент.
Если я изменю ваш SQLFiddle, чтобы использовать text_pattern_ops
для индекса en_US
, вы увидите, что он может использовать индекс а>:
create index tab_ix_foo on tab using btree (foo collate "en_US" text_pattern_ops);
-- ^^^^^^^^^^^^^^^^
Вполне вероятно, что вам потребуется создать разные индексы для разных сопоставлений, если вы используете параметр COLLATE
в версии 9.2+, поскольку по определению разные сопоставления подразумевают разный порядок строк и, следовательно, разную организацию b-дерева. Похоже, вы уже делаете это в своих тестах.
Также возможно, что ваши данные слишком малы для использования индекса, чтобы быть особенно полезным. Попробуйте протестировать более полезный объем данных.
Этот пост может быть полезен , а также документы по поддержке сортировки.
Почему вы не можете просто использовать один и тот же индекс b-дерева для разных сопоставлений, учтите, что b-деревья требуют стабильного и согласованного порядка, но:
regress=> SELECT ' Bill''s' > ('bills' COLLATE "POSIX");
?column?
----------
f
(1 row)
regress=> SELECT ' Bill''s' > ('bills' COLLATE "en_US");
?column?
----------
t
(1 row)
Как видите, сопоставление меняет порядок сортировки. Это то, что делает сопоставление, в значительной степени по определению. Попытка использовать один и тот же индекс для разных сопоставлений подобна попытке использовать один и тот же функциональный индекс для разных функций; это не имеет абсолютно никакого смысла.
person
Craig Ringer
schedule
24.03.2013
EXPLAIN ANALYZE
из настоящих проблемных запросов. - person Craig Ringer   schedule 24.03.2013EXPLAIN
. - person jameshfisher   schedule 24.03.2013