C
Sortowania jest właściwym wyborem.
Wszystko jest trochę szybsze bez ustawień regionalnych. A ponieważ żadne sortowanie i tak nie jest prawidłowe, utwórz bazę danych bez sortowania, co oznacza za pomocą C
.
Konieczne może być zestawienie wielu operacji. Jednak nie powinno być zauważalnej różnicy prędkości między zestawieniem domyślnym a zestawieniem ad-hoc. W końcu to tylko nieposortowane dane, a zasady sortowania są stosowane podczas sortowania.
Należy pamiętać, że Postgres opiera się na ustawieniach regionalnych dostarczonych przez podstawowy system operacyjny, dlatego należy wygenerować ustawienia narodowe dla każdego używanego ustawienia narodowego. Więcej w powiązanej odpowiedzi na temat SO tutaj i tutaj .
Jednak, jak już wspomniano @Craig , indeksy stanowią wąskie gardło w tym scenariuszu. Sortowanie indeksu musi odpowiadać sortowaniu zastosowanego operatora w wielu przypadkach, które dotyczą danych znakowych.
Możesz użyć COLLATE
specyfikatora w indeksach, aby utworzyć pasujące indeksy. Indeksy częściowe mogą być idealnym wyborem, jeśli miksujesz dane w tej samej tabeli.
Na przykład tabela z ciągami międzynarodowymi:
CREATE TABLE string (
string_id serial
,lang_id int NOT NULL
,string text NOT NULL
);
I najbardziej interesuje Cię jeden język naraz:
SELECT *
FROM string
WHERE lang_id = 5 -- 5 being German / Germany here
AND string > 'foo' COLLATE "de_DE"
ORDER BY string COLLATE "de_DE";
Następnie utwórz częściowe indeksy, takie jak:
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;
Jeden dla każdego języka, którego potrzebujesz.
W rzeczywistości dziedziczenie może być lepszym podejściem dla takiej tabeli. Następnie możesz mieć zwykły indeks na każdej odziedziczonej tabeli zawierający tylko ciągi znaków dla jednego ustawienia narodowego. Oczywiście musisz czuć się komfortowo dzięki specjalnym zasadom dotyczącym odziedziczonych tabel.