Ruby on Rails'de PostgreSQL (9.4) veritabanı ile bir uygulama geliştiriyorum. Kullanım durumum için, uygulamanın bütün noktası bir model üzerinde çok özel özellikler ararken, tablolardaki sütunlar çok sık aranacaktır.
Şu anda sütunlarda bir integer
tür kullanılıp kullanılmayacağına veya sütunlar için tipik bir dize türünün (örneğin character varying(255)
, Rails'teki varsayılan ) kullanılmasına karar veriyorum, çünkü performans farkının dizinde ne olacağından emin değilim.
Bu sütunlar enums . Olabilecekleri değerlerin miktarı için sabit bir boyuta sahiptirler. Çoğu enum uzunluğu 5'i geçmez, yani endeks uygulamanın kullanım ömrü boyunca az ya da çok sabitlenir ; Bu nedenle, tamsayı ve dize dizinleri düğüm sayısında aynı olacaktır.
Bununla birlikte, indekslenecek olan dize yaklaşık 20 karakter uzunluğunda olabilir, bellekte kabaca tamsayının 5 katıdır (eğer bir tamsayı 4 byte ise ve dizeler karakter başına 1 byte saf ASCII ise, bu tutar). Veritabanı motorlarının dizin aramalarını nasıl yaptığını bilmiyorum, ancak dizeyi tam olarak eşleşene kadar "taraması" gerekiyorsa , bu durumda, dize aramasının tamsayı aramasından 5 kat daha yavaş olacağı anlamına gelir; tamsayı araması için eşleşene kadar "tarama" 20 yerine 4 bayt olur. Bu, hayal ettiğim şey:
Arama değeri (tamsayı) 4:
tarama ........................… kayıtları alınıyor ... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... |
Arama değeri (string) "some_val" (8 bayt):
tarama................................................. .................................. .. kayıtları alınıyor ... | BYTE_1 | BYTE_2 | BYTE_3 | BYTE_4 | BYTE_5 | BYTE_6 | BYTE_7 | BYTE_8 | ... |
Umarım bu mantıklı geliyor. Temel olarak, tam sayı daha az yer kapladığından, dize eşdeğerinden daha hızlı "eşleştirilebilir". Belki de bu tamamen yanlış bir tahmin, ama ben uzman değilim, bu yüzden size soruyorum. Sanırım az önce bulduğum bu cevap hipotezimi destekliyor gibi görünüyor, ama emin olmak istiyorum.
Sütundaki olası değerlerin sayısı ikisinde de değişmez, bu nedenle dizinin kendisi değişmez (enum'a yeni bir değer eklemediğim sürece). Bu durumda, integer
ya da varchar(255)
, ya da bir tamsayı türünü kullanmanın bir anlamı var mıdır?
Sormamın sebebi Rails'in enum
tipinin tamsayıları dize tuşlarıyla eşleştirmesidir, ancak kullanıcının karşı karşıya oldukları sütunlar değildir. Temel olarak, enum değerinin geçerli bir değer olduğunu doğrulayamazsınız, çünkü geçersiz bir değer ArgumentError
herhangi bir doğrulamanın çalıştırılmasından önce bir değere neden olur . Bir string
türün kullanılması doğrulama işlemine olanak sağlar, ancak performans maliyeti varsa, doğrulama sorununu çözmeyi tercih ederim.
varchar(255)
Örneğin , SQL Server'da örneğin hiçbir optimizasyon yokturvarchar(260)
. SQL Server 6.x ile böyle bir şey olabilirdi ama bu uzun süredir doğru değildi.