12c - Limit the PGA

De acordo com a documentação oficial da Oracle, o parâmetro PGA_AGGREGATE_LIMIT é setado como default para o maior valor entre:

  • 2 GB (valor default)
  • 200% do valor do parâmetro PGA_AGGREGATE_TARGET
  • 3 MB multiplicado pelo valor do parâmetro PROCESSES

Este parâmetro deve ser menor que o seguinte cálculo:

  • Menor que 1.2 X RAM – SGA

Devido a um problema de interpretação da documentação, alguns DBAs pensavam que o parâmetro pga_aggregate_target era o limite máximo de PGA que o banco iria utilizar, mas isso é incorreto.

Também existe o parâmetro _pga_max_size (parâmetro oculto) que podia ser usado para limitar a memória de um processo. Mas além de não limitar da forma esperada, não deve ser utilizado sem a ajuda do suporte da Oracle.

Antes de existir o parâmetro PGA_AGGREGATE_LIMIT , o banco de dados podia exceder a quantidade real de RAM, causando erros de paginação e até mesmo RAC node eviction.

O parâmetro PGA_AGGREGATE_LIMIT é dinâmico, com isso não é necessário reiniciar o banco de dados ao fazer uma alteração. 

Alguns detalhes importantes:

  • A Oracle não recomendar setar esse valor abaixo do default
  • Se o valor setado for 0, não existirá limite para utilização de PGA
  • O Oracle Database tratará as queries paralelas como uma única unidade


Verificando o valor default:

SQL> show parameter pga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 2G
pga_aggregate_target                 big integer 100M


Alterando o valor do parâmetro processes, para verificar como fica o PGA_AGGREGATE_LIMIT

SQL> show parameter processes

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
processes                            integer     300


SQL> alter system set processes=1000 scope=spfile;
System altered.

Após alteração do parâmetro processes é necessário reiniciar o banco de dados.

Verificando o Alert.log:

Mon Jan 27 16:25:17 2014
Using default pga_aggregate_limit of 3000 MB


SQL> show parameter pga_aggregate_limit

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 3G


Tentando diminuir o valor do parâmetro PGA_AGGREGATE_LIMIT, para um valor menor que o permitido:

SQL> alter system set pga_aggregate_limit=100m;
alter system set pga_aggregate_limit=100m
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00093: pga_aggregate_limit must be between 2048M and 100000G

Lembrando que é possível diminuir esse valor diretamente no PFILE ou SPFILE.

Ao executar um código que exceda o valor máximo permitido:

Mon Jan 27 16:25:17 2014
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_23340.trc (incident=12901):
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT


Trecho retirado da documentação:

Oracle Database aborts or terminates the sessions or processes that are consuming the most untunable PGA memory in the following order:
  • Calls for sessions that are consuming the most untunable PGA memory are aborted.
  • If PGA memory usage is still over the PGA_AGGREGATE_LIMIT, then the sessions and processes that are consuming the most untunable PGA memory are terminated.

Referências:





Abraço


Alex Zaballa

0 comentários: