Die C
Zusammenstellung ist die richtige Wahl.
Ohne Gebietsschema ist alles etwas schneller. Und da ohnehin keine Sortierung richtig ist, erstellen Sie die Datenbank ohne Sortierung, dh mit C
.
Es kann schwierig sein, für viele Operationen eine Sammlung bereitzustellen. Es sollte jedoch keinen merklichen Geschwindigkeitsunterschied zwischen der Standardkollatierung und einer Ad-hoc-Kollatierung geben. Schließlich handelt es sich nur um unsortierte Daten, und beim Sortieren werden Sortierungsregeln angewendet.
Beachten Sie, dass Postgres auf den Gebietsschemaeinstellungen aufbaut, die vom zugrunde liegenden Betriebssystem bereitgestellt werden. Daher müssen für jedes zu verwendende Gebietsschema Gebietsschemas generiert werden. Mehr in verwandter Antwort auf SO hier und hier .
Wie @Craig bereits erwähnte , sind Indizes der Engpass in diesem Szenario. Die Kollatierung des Index muss in vielen Fällen mit der Kollatierung des angewendeten Operators übereinstimmen, bei denen es sich um Zeichendaten handelt.
Sie können den COLLATE
Bezeichner in Indizes verwenden, um übereinstimmende Indizes zu erstellen. Teilindizes sind möglicherweise die perfekte Wahl, wenn Sie Daten in derselben Tabelle mischen.
Zum Beispiel eine Tabelle mit internationalen Zeichenfolgen:
CREATE TABLE string (
string_id serial
,lang_id int NOT NULL
,string text NOT NULL
);
Und Sie interessieren sich hauptsächlich für jeweils eine Sprache:
SELECT *
FROM string
WHERE lang_id = 5 -- 5 being German / Germany here
AND string > 'foo' COLLATE "de_DE"
ORDER BY string COLLATE "de_DE";
Dann erstelle Teilindizes wie:
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;
Eine für jede Sprache, die Sie benötigen.
Tatsächlich könnte die Vererbung für eine Tabelle wie diese ein überlegener Ansatz sein. Dann können Sie für jede geerbte Tabelle einen einfachen Index erstellen, der nur Zeichenfolgen für ein einzelnes Gebietsschema enthält. Natürlich müssen Sie mit den Sonderregeln für geerbte Tabellen vertraut sein.