La C
colación es la elección correcta.
Todo es un poco más rápido sin configuración regional. Y como de todos modos no hay una clasificación correcta, cree la base de datos sin clasificación, es decir, con C
.
Puede ser una molestia tener que proporcionar una recopilación para muchas operaciones. Sin embargo, no debería haber una diferencia notable en la velocidad entre la clasificación predeterminada y una clasificación ad-hoc. Después de todo, solo son datos sin clasificar, y las reglas de clasificación se aplican al ordenar.
Tenga en cuenta que Postgres se basa en la configuración regional proporcionada por el sistema operativo subyacente, por lo que debe tener locales generados para cada configuración regional que se utilizará. Más en la respuesta relacionada sobre SO aquí y aquí .
Sin embargo, como @Craig ya mencionó , los índices son el cuello de botella en este escenario. La clasificación del índice tiene que coincidir con la clasificación del operador aplicado en muchos casos que involucran datos de caracteres.
Puede usar el COLLATE
especificador en los índices para producir índices coincidentes. Los índices parciales pueden ser la elección perfecta si está mezclando datos en la misma tabla.
Por ejemplo, una tabla con cadenas internacionales:
CREATE TABLE string (
string_id serial
,lang_id int NOT NULL
,string text NOT NULL
);
Y usted está principalmente interesado en un idioma a la vez:
SELECT *
FROM string
WHERE lang_id = 5 -- 5 being German / Germany here
AND string > 'foo' COLLATE "de_DE"
ORDER BY string COLLATE "de_DE";
Luego cree índices parciales como:
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;
Uno para cada idioma que necesites.
En realidad, la herencia podría ser un enfoque superior para una tabla como esta. Entonces puede tener un índice simple en cada tabla heredada que contenga solo cadenas para una sola configuración regional. Por supuesto, debe sentirse cómodo con las reglas especiales para las tablas heredadas.