「是否有任何性能影響 - 將它減慢我的SQL查詢 ?」
與有關性能的所有問題的答案是,「這取決於」。 RLS的工作原理是在適用的政策功能作爲一個WHERE子句的外部查詢包裹的控制查詢...
select /*+ rls query */ * from (
select /*+ your query */ ... from t23
where whatever = 42)
where rls_policy.function_t23 = 'true'
所以對性能的影響完全依靠在功能上發生的事情。
做這些事的正常方法是使用上下文命名空間。這些是通過SYS_CONTEXT()函數訪問的會話內存的預定義區域。因此,從上下文中檢索存儲值的成本可以忽略不計。正如我們通常在每個會話中填充名稱空間一樣 - 比如通過登錄後觸發器或類似的連接鉤子 - 每個查詢的總體成本是微不足道的。有不同的方法可以刷新名稱空間,這可能會影響性能,但這些在事務的整體方案中也是微不足道的(see this other answer)。
所以性能影響取決於你的功能實際上做了什麼。這給我們帶來一個考慮您的實際政策:
「這RLS政策(來隱藏IS_HISTORICAL = T記錄)」
好消息是這樣的功能的執行被本身不太昂貴。壞消息是表現可能仍然是Teh Suck!無論如何,如果現場記錄與歷史記錄的比例是不利的。您可能最終將檢索所有記錄,然後過濾出歷史記錄。優化器可能會將RLS謂詞推入主查詢中,但我認爲這不太可能,因爲RLS的工作方式是:它避免將策略的標準暴露給普通注視(這使得調試RLS操作成爲一個真正的PITN)。
您的用戶將支付您糟糕的設計決定的價格。使用日誌或歷史表存儲舊記錄並僅保留實際表中的實時數據要好得多。將歷史記錄與現場記錄一起保存,很少成爲一個可擴展的解決方案。
「任何許可證含義?
DBMS_RLS需要企業版許可證。
來源
2013-02-19 09:18:05
APC
取決於您的上下文級別,但靜態上下文(例如)不會成爲性能問題的原因(VPD本身不會比執行select操作的應用程序更慢* ...其中is_historical ='N' ...)。 – tbone 2013-02-19 13:48:07