考慮一個確定性的功能,如:確定性函數何時使用之前的計算值?
CREATE OR REPLACE FUNCTION SCHEMA.GET_NAME(ss_id nvarchar2
) RETURN nvarchar2 DETERMINISTIC IS
tmpVar nvarchar2(500);
BEGIN
select name into tmpvar from logistics.organization_items
where id = ss_id ;
return tmpvar ;
END ss_name;
使用蟾蜍我叫SCHEMA.GET_NAME(1)
並返回A
。然後,我將表中的值從A
更改爲B
,並調用SCHEMA.GET_NAME(1)
返回B
。
這是一個很好的結果。但我怕根據this page in the documentation沒有被更新的值,這說的:
當Oracle數據庫在遇到這些情形之一的確定性函數,它會嘗試使用先前的計算結果可能時,而不是重新執行功能。如果隨後更改函數的語義,則必須手動重建所有從屬函數索引和實例化視圖。
在什麼情況下會的GET_NAME(1)
返回一箇舊的緩存值(A
而不是B
)的值?
感謝您的完整答案。此外,我還喜歡現在多久刷新此功能的緩存?在執行查詢的範圍內?一段時間?關於釋放緩存的內存需求? – mehrandvd
或者也許緩存僅在會話期間有效。所以對於新的會議,它會更新? – mehrandvd
@mehrandvd - 我不知道這個特性的細節,但是我有一種感覺,就像其他大多數優化一樣:優化器感覺像是這樣。換句話說,有** NO WAY **來保證它被緩存/更新(有一些概率,主要是緩存,但沒有保證)。這與運行沒有ORDER BY的查詢類似 - 你得到優化器決定給你的命令,而不是你想要的。 –