Oracle
 sql >> Database >  >> RDS >> Oracle

Implicazioni sulle prestazioni dell'utilizzo di (DBMS_RLS) Oracle Row Level Security (RLS)?

Come per tutte le domande relative alle prestazioni, la risposta è "dipende". RLS funziona racchiudendo la query controllata in una query esterna che applica la funzione della politica come clausola WHERE...

select /*+ rls query */ * from ( 
    select /*+ your query */ ... from t23 
    where whatever = 42 )
where rls_policy.function_t23 = 'true'

Quindi le implicazioni sulle prestazioni dipendono interamente da ciò che accade nella funzione.

Il modo normale per fare queste cose è usare gli spazi dei nomi di contesto. Si tratta di aree predefinite della memoria di sessione a cui si accede tramite la funzione SYS_CONTEXT(). In quanto tale, il costo per recuperare un valore memorizzato da un contesto è trascurabile. E poiché normalmente popoleremmo gli spazi dei nomi una volta per sessione, ad esempio tramite un trigger dopo l'accesso o un hook di connessione simile, il costo complessivo per query è banale. Esistono diversi modi per aggiornare lo spazio dei nomi che potrebbero avere implicazioni sulle prestazioni, ma ancora una volta questi sono banali nello schema generale delle cose (vedi quest'altra risposta ).

Quindi l'impatto sulle prestazioni dipende da cosa fa effettivamente la tua funzione. Il che ci porta a prendere in considerazione la tua politica attuale:

La buona notizia è l'esecuzione di una tale funzione è improbabile che sia di per sé costosa. La cattiva notizia è che la performance potrebbe essere ancora Teh Suck! comunque, se il rapporto tra registrazioni dal vivo e registrazioni storiche è sfavorevole. Probabilmente finirai per recuperare tutti i record e quindi filtrare quelli storici. L'ottimizzatore potrebbe inserire il predicato RLS nella query principale, ma penso che sia improbabile a causa del modo in cui funziona RLS:evita di rivelare i criteri della politica allo sguardo generale (il che rende il debug delle operazioni RLS un vero PITN).

I tuoi utenti pagheranno il prezzo della tua cattiva decisione di progettazione. È molto meglio avere tabelle di journaling o cronologiche per archiviare i vecchi record e mantenere solo i dati in tempo reale nelle tabelle reali. Conservare i documenti storici insieme a quelli live è raramente una soluzione che si adatta.

DBMS_RLS richiede una licenza Enterprise Edition.