Jako na všechny otázky týkající se výkonu, odpověď zní:„záleží“. RLS funguje tak, že řízený dotaz zabalí do vnějšího dotazu, který použije funkci zásady jako klauzuli WHERE...
select /*+ rls query */ * from (
select /*+ your query */ ... from t23
where whatever = 42 )
where rls_policy.function_t23 = 'true'
Důsledky výkonu tedy spočívají výhradně na tom, co je součástí funkce.
Normálním způsobem provádění těchto věcí je použití kontextových jmenných prostorů. Toto jsou předdefinované oblasti paměti relace, ke kterým se přistupuje pomocí funkce SYS_CONTEXT(). Náklady na získání uložené hodnoty z kontextu jsou jako takové zanedbatelné. A protože bychom normálně naplnili jmenné prostory jednou za relaci – řekněme aktivací po přihlášení nebo podobným spojovacím hákem – celkové náklady na dotaz jsou triviální. Existují různé způsoby obnovení jmenného prostoru, které mohou mít dopad na výkon, ale opět jsou triviální v celkovém schématu věcí (viz tato další odpověď ).
Dopad na výkon tedy závisí na tom, co vaše funkce skutečně dělá. Což nás přivádí k úvaze o vašich skutečných zásadách:
Dobrou zprávou je provedení Je nepravděpodobné, že by taková funkce byla sama o sobě nákladná. Špatnou zprávou je, že výkon může být stále Teh Suck! každopádně, pokud je poměr živých záznamů k historickým záznamům nepříznivý. Pravděpodobně skončíte s tím, že načtete všechny záznamy a poté odfiltrujete ty historické. Optimalizátor může vložit predikát RLS do hlavního dotazu, ale myslím si, že je to nepravděpodobné kvůli tomu, jak RLS funguje:vyhýbá se odhalení kritérií politiky obecnému pohledu (což dělá z ladění operací RLS skutečnou PITN).
Vaši uživatelé zaplatí cenu za vaše špatné rozhodnutí o návrhu. Je mnohem lepší mít žurnálovací nebo historické tabulky pro ukládání starých záznamů a uchovávat pouze živá data ve skutečných tabulkách. Uchovávání historických záznamů vedle živých záznamů je zřídkakdy řešením, které se mění.
DBMS_RLS vyžaduje licenci Enterprise Edition.