Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wpływ na wydajność używania (DBMS_RLS) Oracle Row Level Security (RLS)?

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Budowanie dynamicznego zapytania w C# (atak wstrzykiwania SQL)

  2. Uzyskiwanie różnych wyników szyfrowania między C#.Net i Oracle

  3. Zmiana hasła w Oracle SQL Developer

  4. Jak wykonać operację wsadową za pomocą pl/sql

  5. Dlaczego otrzymuję PLS-00302:komponent musi być zadeklarowany, gdy istnieje?