Le C
classement est le bon choix.
Tout est un peu plus rapide sans locale. Et comme aucun classement n'est correct de toute façon, créez la base de données sans classement, c'est-à-dire avec C
.
Il peut être difficile de devoir fournir un classement pour de nombreuses opérations. Cependant, il ne devrait pas y avoir de différence notable de vitesse entre le classement par défaut et un classement ad hoc. Après tout, ce ne sont que des données non triées et des règles de classement sont appliquées lors du tri.
Sachez que Postgres s'appuie sur les paramètres régionaux fournis par le système d'exploitation sous-jacent, vous devez donc générer des paramètres régionaux pour chaque paramètre régional à utiliser. Plus dans la réponse connexe sur SO ici et ici .
Cependant, comme @Craig l'a déjà mentionné , les index sont le goulot d'étranglement dans ce scénario. Le classement de l'index doit correspondre au classement de l'opérateur appliqué dans de nombreux cas qui impliquent des données de caractères.
Vous pouvez utiliser le COLLATE
spécificateur dans les index pour produire des index correspondants. Les index partiels peuvent être le choix parfait si vous mélangez des données dans la même table.
Par exemple, une table avec des chaînes internationales:
CREATE TABLE string (
string_id serial
,lang_id int NOT NULL
,string text NOT NULL
);
Et vous êtes surtout intéressé par une langue à la fois:
SELECT *
FROM string
WHERE lang_id = 5 -- 5 being German / Germany here
AND string > 'foo' COLLATE "de_DE"
ORDER BY string COLLATE "de_DE";
Créez ensuite des index partiels comme:
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;
Un pour chaque langue dont vous avez besoin.
En fait, l' héritage pourrait être une approche supérieure pour une table comme celle-ci. Ensuite, vous pouvez avoir un index simple sur chaque table héritée contenant uniquement des chaînes pour un seul paramètre régional. Vous devez bien sûr être à l'aise avec les règles spéciales pour les tables héritées.