Evet yapabilirsin!! Çözüm kolay, güvenli ve başarılı olmalı ...
Postgresql'de yeniyim, ancak görünen o ki bir görünümle eşleştirilmiş bir ifade dizini kullanarak hesaplanmış sütunlar oluşturabilirsiniz (görünüm isteğe bağlıdır, ancak hayatı biraz daha kolaylaştırır).
Hesaplamamın şöyle olduğunu varsayalım md5(some_string_field)
, sonra dizini şu şekilde oluşturuyorum:
CREATE INDEX some_string_field_md5_index ON some_table(MD5(some_string_field));
Şimdi, işe yarayan tüm sorgular MD5(some_string_field)
, dizini sıfırdan hesaplamak yerine kullanacaktır. Örneğin:
SELECT MAX(some_field) FROM some_table GROUP BY MD5(some_string_field);
Bunu açıklayarak kontrol edebilirsiniz .
Ancak bu noktada, tablonun kullanıcılarının tam olarak sütunun nasıl oluşturulacağını bilmelerine güveniyorsunuz. Hayatı kolaylaştırmak için, VIEW
hesaplanan değeri yeni bir sütun olarak ekleyerek, orijinal tablonun artırılmış bir sürümüne bir üstüne oluşturabilirsin :
CREATE VIEW some_table_augmented AS
SELECT *, MD5(some_string_field) as some_string_field_md5 from some_table;
Artık kullanan herhangi bir sorgu some_table_augmented
, some_string_field_md5
nasıl çalıştığı konusunda endişelenmeden kullanabilecek ... sadece iyi performans elde ediyorlar. Görünüm, orijinal tablodaki herhangi bir veriyi kopyalamıyor, bu nedenle performans açısından olduğu kadar bellek açısından da iyidir. Ancak bir görünüme güncelleme / ekleme yapamayacağınızı, yalnızca kaynak tabloya ekleyemeyeceğinizi unutmayın, ancak gerçekten istiyorsanız, ekleri ve güncellemeleri kuralları kullanarak kaynak tabloya yeniden yönlendirebileceğinize inanıyorum (bu son noktada yanılmış olabilirim. Kendim hiç denemedim).
Düzenleme: Sorgu rakip endeksleri içeriyorsa, planlayıcı motoru bazen ifade-dizinini hiç kullanmayabilir. Seçim veriye bağlı görünüyor.