该C
整理是正确的选择。
没有语言环境,一切都会更快。而且由于没有正确的排序规则,因此请创建没有排序规则的数据库,即使用C
。
必须为许多操作提供排序规则可能很痛苦。但是,默认排序规则和临时排序规则之间的速度不应有明显的差异。毕竟,它们只是未排序的数据,排序时会应用排序规则。
请注意,Postgres建立在基础操作系统提供的语言环境设置的基础上,因此您需要为要使用的每个语言环境生成语言环境。在这里和这里有关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;
一种您需要的每种语言。
实际上,对于这样的表,继承可能是一种更好的方法。然后,您可以在每个继承的表上具有一个纯索引,该索引仅包含单个语言环境的字符串。当然,您需要熟悉继承表的特殊规则。