C
Сверка является правильным выбором.
Все немного быстрее без локали. А так как никакое сопоставление не является правильным, создайте базу данных без сопоставления, то есть с C
.
Это может быть боль, чтобы обеспечить сопоставление для многих операций. Однако не должно быть заметной разницы в скорости между сопоставлением по умолчанию и специальным сопоставлением. Ведь это просто несортированные данные, и при сортировке применяются правила сортировки.
Имейте в виду, что Postgres основывается на настройках локали, предоставляемых базовой ОС, поэтому вам нужно генерировать локали для каждой используемой локали. Больше в соответствующем ответе на SO здесь и здесь .
Однако, как @Craig уже упоминалось , индексы являются узким местом в этом сценарии. Сортировка индекса должна соответствовать сличению применяемого оператора во многих случаях, когда используются символьные данные.
Вы можете использовать COLLATE
спецификатор в индексах для создания соответствующих индексов. Частичные индексы могут быть идеальным выбором, если вы смешиваете данные в одной таблице.
Например, таблица с международными строками:
CREATE TABLE string (
string_id serial
,lang_id int NOT NULL
,string text NOT NULL
);
И вы в основном интересуетесь одним языком одновременно:
SELECT *
FROM string
WHERE lang_id = 5 -- 5 being German / Germany here
AND string > 'foo' COLLATE "de_DE"
ORDER BY string COLLATE "de_DE";
Затем создайте частичные индексы, такие как:
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;
Один для каждого языка, который вам нужен.
На самом деле наследование может быть лучшим подходом для такой таблицы. Тогда вы можете иметь простой индекс для каждой унаследованной таблицы, содержащей только строки для одной локали. Конечно, вы должны быть знакомы со специальными правилами для унаследованных таблиц.