Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Implicações de desempenho do uso de (DBMS_RLS) Oracle Row Level Security (RLS)?


Como em todas as questões relacionadas ao desempenho, a resposta é "depende". O RLS funciona envolvendo a consulta controlada em uma consulta externa que aplica a função de política como uma cláusula WHERE...
select /*+ rls query */ * from ( 
    select /*+ your query */ ... from t23 
    where whatever = 42 )
where rls_policy.function_t23 = 'true'

Portanto, as implicações de desempenho dependem inteiramente do que acontece na função.

A maneira normal de fazer essas coisas é usar namespaces de contexto. Essas são áreas predefinidas da memória de sessão acessadas por meio da função SYS_CONTEXT(). Como tal, o custo de recuperar um valor armazenado de um contexto é insignificante. E como normalmente preenchemos os namespaces uma vez por sessão - digamos, por um gatilho após o logon ou um gancho de conexão semelhante - o custo geral por consulta é trivial. Existem diferentes maneiras de atualizar o namespace que podem ter implicações de desempenho, mas, novamente, elas são triviais no esquema geral das coisas (veja esta outra resposta ).

Portanto, o impacto no desempenho depende do que sua função realmente faz. O que nos leva a considerar sua política real:

A boa notícia é a execução de tal função é improvável que seja caro em si mesmo. A má notícia é que o desempenho ainda pode ser Teh Suck! de qualquer forma, se a proporção de registros ao vivo para registros históricos for desfavorável. Você provavelmente vai acabar recuperando todos os registros e depois filtrando os históricos. O otimizador pode enviar o predicado RLS para a consulta principal, mas acho improvável devido à maneira como o RLS funciona:evita revelar os critérios da política para o olhar geral (o que torna a depuração de operações RLS um PITN real).

Seus usuários pagarão o preço de sua má decisão de design. É muito melhor ter tabelas de journalling ou de histórico para armazenar registros antigos e manter apenas dados ativos nas tabelas reais. Reter registros históricos ao lado de registros ao vivo raramente é uma solução que escala.

DBMS_RLS requer uma licença Enterprise Edition.