IMMUTABLE, VOLATILE ve STABLE işlevlerinin tanımlarındaki gerçek anlamdan emin değilim.
Belgeleri, özellikle her birinin tanımlarını okudum.
IMMUTABLE, işlevin veritabanını değiştiremeyeceğini ve aynı bağımsız değişken değerleri verildiğinde her zaman aynı sonucu döndürdüğünü gösterir ; yani, veritabanı aramaları yapmaz ya da doğrudan bağımsız değişken listesinde bulunmayan bilgileri kullanmaz. Bu seçenek verilirse, işlevin tüm sabit argümanları olan herhangi bir çağrısı hemen işlev değeri ile değiştirilebilir.
STABLE, işlevin veritabanını değiştiremeyeceğini ve tek bir tablo taramasında aynı bağımsız değişken değerleri için sürekli olarak aynı sonucu döndüreceğini , ancak sonucunun SQL deyimleri arasında değişebileceğini belirtir. Bu, sonuçları veritabanı aramalarına, parametre değişkenlerine (geçerli saat dilimi gibi), vb. Bağlı olan işlevler için uygun seçimdir. (Geçerli komut tarafından değiştirilen satırları sorgulamak isteyen AFTER tetikleyicileri için uygun değildir.) Ayrıca current_timestamp işlev ailesi, değerleri bir işlem içinde değişmediği için kararlı olarak nitelendirilir.
VOLATILE, işlev değerinin tek bir tablo taramasında bile değişebileceğini, dolayısıyla hiçbir optimizasyon yapılamayacağını belirtir. Nispeten az sayıda veritabanı fonksiyonu bu anlamda değişkendir; bazı örnekler random (), currval (), timeofday () şeklindedir. Ancak, yan etkileri olan herhangi bir işlevin, aramaların optimize edilmesini önlemek için, sonucu oldukça öngörülebilir olsa bile, uçucu olarak sınıflandırılması gerektiğini unutmayın; bir örnek setval () şeklindedir.
Karışıklık, her zaman aynı argümanlar göz önüne alındığında, DAİMA veya SÜREKLİ olarak aynı sonucu döndürdüğü DERECE VE KARARLI koşulu ile birlikte gelir .
IMMUTABLE tanımı, işlevin aramaları veritabanı kullanmadığını veya bağımsız değişken listesinde doğrudan bulunmayan bilgileri kullanmadığını belirtir. Yani, bu, bu tür işlevlerin istemci tarafından sağlanan verileri işlemek için kullanıldığı ve SELECT ifadelerine sahip olmaması gerektiği anlamına geliyor ... ancak bu bana biraz garip geliyor.
STABLE ile tanım, tutarlı olarak aynı sonucu döndürmesi gerektiğini söylemesi bakımından benzerdir. Yani, bana göre, bu işlev aynı argümanlarla her çağrıldığında, aynı sonuçları döndürmelidir (her seferinde aynı satırlar).
Yani, benim için ... bu, güncellenebilen bir tablo veya tablolarda SELECT yapan herhangi bir işlevin yalnızca geçici olması gerektiği anlamına gelir.
Ama, yine ... bu bana doğru gelmiyor.
Bunu tekrar kullanım durumuma getirerek, sürekli eklenen tablolarda birden fazla JOIN ile SELECT ifadeleri gerçekleştiren işlevler yazıyorum, böylece işlev çağrıları her seferinde aynı argümanlarda bile farklı sonuçlar döndürmesi bekleniyor .
Bu, işlevlerimin VOLATİL olması gerektiği anlamına mı geliyor? Belgeler nispeten az sayıda veritabanı fonksiyonunun bu anlamda değişken olduğunu göstermesine rağmen ?
Teşekkür ederim!