C
照合は、正しい選択です。
ロケールがなければ、すべてが少し速くなります。何の照合が右とにかくされていないので、データベースを作成せずに意味、照合C
。
多くの操作で照合を提供する必要があるのは苦痛かもしれません。ただし、デフォルトの照合とアドホック照合の速度に顕著な違いはないはずです。結局のところ、それは単にソートされていないデータであり、ソート時には照合規則が適用されます。
Postgresは基盤となるOSによって提供されるロケール設定に基づいて構築されるため、使用するロケールごとにロケールを生成する必要があることに注意してください。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;
必要な言語ごとに1つ。
実際、このようなテーブルでは、継承が優れたアプローチかもしれません。次に、単一のロケールの文字列のみを含む継承された各テーブルにプレーンインデックスを設定できます。もちろん、継承されたテーブルの特別なルールに慣れる必要があります。