Jak na wszystkie pytania dotyczące wydajności, odpowiedź brzmi „to zależy”. RLS działa poprzez zawinięcie kontrolowanego zapytania w zapytanie zewnętrzne, które stosuje funkcję polityki jako klauzulę WHERE...
select /*+ rls query */ * from (
select /*+ your query */ ... from t23
where whatever = 42 )
where rls_policy.function_t23 = 'true'
Zatem wpływ na wydajność zależy wyłącznie od tego, co dzieje się w funkcji.
Normalnym sposobem robienia tych rzeczy jest użycie kontekstowych przestrzeni nazw. Są to predefiniowane obszary pamięci sesji, do których dostęp uzyskuje się za pomocą funkcji SYS_CONTEXT(). W związku z tym koszt pobrania przechowywanej wartości z kontekstu jest znikomy. A ponieważ normalnie wypełnialibyśmy przestrzenie nazw raz na sesję – powiedzmy przez wyzwalacz po zalogowaniu lub podobny zaczep połączenia – całkowity koszt na zapytanie jest trywialny. Istnieją różne sposoby odświeżania przestrzeni nazw, które mogą mieć wpływ na wydajność, ale znowu są one trywialne w ogólnym schemacie rzeczy (zobacz inną odpowiedź ).
Tak więc wpływ na wydajność zależy od tego, co faktycznie robi Twoja funkcja. Co prowadzi nas do rozważenia Twojej aktualnej polityki:
Dobrą wiadomością jest egzekucja jest mało prawdopodobne, aby taka funkcja była sama w sobie kosztowna. Zła wiadomość jest taka, że wydajność może nadal być Teh Suck! tak czy inaczej, jeśli stosunek zapisów na żywo do zapisów historycznych jest niekorzystny. Prawdopodobnie w końcu odzyskasz wszystkie zapisy, a następnie odfiltrujesz te historyczne. Optymalizator może wepchnąć predykat RLS do głównego zapytania, ale myślę, że jest to mało prawdopodobne ze względu na sposób działania RLS:unika on ujawniania kryteriów polityki ogólnemu spojrzeniu (co sprawia, że debugowanie operacji RLS jest prawdziwym PITN).
Twoi użytkownicy zapłacą cenę Twojej złej decyzji projektowej. O wiele lepiej jest mieć tabele kronikowania lub historii, aby przechowywać stare rekordy i przechowywać tylko aktualne dane w rzeczywistych tabelach. Przechowywanie zapisów historycznych obok tych na żywo rzadko jest rozwiązaniem, które można skalować.
DBMS_RLS wymaga licencji Enterprise Edition.