C
Harmanlama doğru seçimdir.
Yerel ayar olmadan her şey biraz daha hızlı. Hiçbir harmanlama doğru neyse olduğuna göre, veritabanı oluşturmak olmadan ile anlam harmanlama C
.
Birçok operasyon için bir harmanlama sağlamak zorunda kalmak acı verici olabilir. Yine de, varsayılan harmanlama ve geçici bir harmanlama arasında hızda gözle görülür bir fark olmamalıdır. Sonuçta bu sadece sıralanmamış verilerdir ve sıralama yapılırken harmanlama kuralları uygulanır.
Postgres'in, temel işletim sistemi tarafından sağlanan yerel ayarlara dayandığını unutmayın; bu nedenle, kullanılacak her bir yerel ayar için yerel ayarlara sahip olmanız gerekir. SO burada ve burada ilgili cevabında daha fazla .
Bununla birlikte, @Craig'in daha önce de belirtildiği gibi , bu senaryoda endeksler darboğazdır. Dizinin harmanlanması, karakter verilerini içeren birçok durumda uygulanan operatörün harmanlaması ile eşleşmelidir.
Sen kullanabilirsiniz COLLATE
eşleştirme endeksleri üretmek için dizinlerinde belirtici. Aynı tabloda verileri karıştırıyorsanız kısmi indeksler mükemmel seçim olabilir.
Örneğin, uluslararası karakterli bir tablo:
CREATE TABLE string (
string_id serial
,lang_id int NOT NULL
,string text NOT NULL
);
Ve bir anda en çok bir dile ilgi duyuyorsun:
SELECT *
FROM string
WHERE lang_id = 5 -- 5 being German / Germany here
AND string > 'foo' COLLATE "de_DE"
ORDER BY string COLLATE "de_DE";
Sonra şöyle kısmi indeksler oluşturun:
CREATE INDEX string_string_lang_id_idx ON string (string COLLATE "de_DE")
WHERE lang_id = 5;
İhtiyacınız olan her dil için bir tane.
Aslında, kalıtım böyle bir tablo için üstün bir yaklaşım olabilir. Daha sonra, miras alınan her tabloda, yalnızca tek bir yerel ayar için yalnızca dizeler içeren düz bir dizin olabilir. Elbette, kalıtsal masalar için özel kurallar konusunda rahat olmanız gerekir.