Ajuste de Cursores no Oracle Database para Performance Tuning


Cursores no Oracle Database são estruturas de memória essenciais para processar consultas SQL, armazenando resultados e gerenciando o acesso aos dados. O ajuste de cursores é uma prática crítica em performance tuning, pois impactos no gerenciamento de cursores podem levar a erros como ORA-01000: maximum open cursors exceeded
, consumo excessivo de memória no shared pool, e aumento no overhead de parsing. Esta documentação detalha os conceitos, parâmetros, estratégias de monitoramento e práticas de otimização para cursores, com foco em melhorar o desempenho do banco de dados.
Conceitos Fundamentais
Cursores Explícitos: Declarados em PL/SQL para processar resultados de consultas específicas.
Cursores Implícitos: Criados automaticamente pelo Oracle para instruções SQL.
Cursores Abertos: Cursores em uso por uma sessão, contabilizados contra o limite do parâmetro
OPEN_CURSORS
.Cursores em Cache: Cursores mantidos na biblioteca de cursores (shared pool) para reutilização, reduzindo o soft parsing.
Problemas comuns relacionados a cursores incluem:
Excesso de cursores abertos, resultando em
ORA-01000
.Alto soft parsing devido à baixa reutilização de cursores.
Fragmentação do shared pool por cursores mal gerenciados.
Parâmetros de Tuning
Os seguintes parâmetros do Oracle Database são cruciais para o ajuste de cursores:
OPEN_CURSORS:
Define o número máximo de cursores abertos por sessão.
Valor padrão: 300 (varia por versão).
Um valor baixo causa
ORA-01000
, enquanto um valor muito alto aumenta o consumo de memória no PGA.Tuning: Ajuste com base no uso máximo observado, com margem de 20-30%.
SESSION_CACHED_CURSORS:
Controla quantos cursores uma sessão pode manter em cache para reutilização.
Valor padrão: 50.
Aumentar este parâmetro reduz o soft parsing, mas consome mais memória no shared pool.
Tuning: Valores entre 100 e 200 são comuns em sistemas com alto parsing.
CURSOR_SHARING:
Determina se literais em consultas SQL são substituídos por variáveis de ligação.
Valores:
EXACT
(padrão),FORCE
.Configurar como
FORCE
promove reutilização de cursores, mas pode alterar planos de execução.Tuning: Use
FORCE
em sistemas com muitas consultas semelhantes, após testes rigorosos.
SHARED_POOL_SIZE:
Define o tamanho do shared pool, que armazena cursores em cache.
Tuning: Aumente se houver fragmentação ou falta de espaço para cursores.
Monitoramento para Tuning
Monitorar o uso de cursores é essencial para identificar gargalos e ajustar parâmetros de forma precisa. As seguintes visões e ferramentas são recomendadas:
V$OPEN_CURSOR:
Lista cursores abertos por sessão.
Consulta para verificar cursores abertos:
SELECT s.sid, s.username, COUNT(*) as open_cursors FROM v$open_cursor oc JOIN v$session s ON oc.sid = s.sid GROUP BY s.sid, s.username ORDER BY open_cursors DESC;
V$SESSTAT e V$STATNAME:
Monitora o número de cursores abertos por sessão.
Exemplo:
SELECT s.sid, s.username, st.value as open_cursors FROM v$sesstat st JOIN v$statname sn ON st.statistic# = sn.statistic# JOIN v$session s ON st.sid = s.sid WHERE sn.name = 'opened cursors current' ORDER BY st.value DESC;
V$SYSSTAT:
Fornece estatísticas globais, como taxa de parsing.
Exemplo:
SELECT name, value FROM v$sysstat WHERE name LIKE 'parse%';
Métricas-chave:
parse count (total)
: Alto valor indica necessidade de mais cache de cursores.cursor cache hits
: Baixa taxa sugere ajustes emSESSION_CACHED_CURSORS
.
AWR e ADDM:
Relatórios AWR identificam alto soft parsing, consumo de shared pool e problemas com cursores.
Verifique:
"Cursor Cache Hit Ratio": Taxa <90% indica necessidade de ajuste.
"Top SQL by Parse Calls": Identifica consultas que geram muitos cursores.
ADDM pode sugerir ajustes em
OPEN_CURSORS
ouSESSION_CACHED_CURSORS
.
SQL Tuning Advisor:
- Analise consultas que consomem muitos cursores para otimização.
Estratégias de Performance Tuning
Ajuste de OPEN_CURSORS:
Use as consultas de monitoramento para determinar o uso máximo de cursores.
Exemplo: Se o pico for 250 cursores, configure:
ALTER SYSTEM SET open_cursors = 350 SCOPE=BOTH;
Monitore o impacto no PGA e ajuste gradualmente.
Otimização de SESSION_CACHED_CURSORS:
Aumente se o AWR indicar alta taxa de soft parsing.
Exemplo:
ALTER SYSTEM SET session_cached_cursors = 150 SCOPE=BOTH;
Verifique a taxa de "cursor cache hits" no AWR após o ajuste.
Uso de CURSOR_SHARING = FORCE:
Aplique em sistemas com consultas repetitivas usando literais.
Exemplo:
ALTER SYSTEM SET cursor_sharing = 'FORCE' SCOPE=BOTH;
Execute testes para garantir que os planos de execução não sejam impactados negativamente.
Gerenciamento do Shared Pool:
Monitore fragmentação com:
SELECT name, value FROM v$sgastat WHERE pool = 'shared pool' AND name LIKE '%free memory%';
Aumente
SHARED_POOL_SIZE
se necessário:ALTER SYSTEM SET shared_pool_size = 500M SCOPE=BOTH;
Otimização de Consultas:
Use variáveis de ligação para reduzir parsing:
SELECT * FROM employees WHERE employee_id = :emp_id;
Evite literais fixos, que criam novos cursores:
-- Evitar: SELECT * FROM employees WHERE employee_id = 100;
Fechamento de Cursores:
Em PL/SQL, garanta que cursores explícitos sejam fechados:
DECLARE CURSOR c IS SELECT * FROM employees; v_employee employees%ROWTYPE; BEGIN OPEN c; FETCH c INTO v_employee; CLOSE c; END;
Diagnóstico de Vazamentos de Cursores:
Identifique sessões com alto uso de cursores:
SELECT s.sid, s.username, c.value as open_cursors, q.sql_text FROM v$session s JOIN v$sesstat c ON s.sid = c.sid JOIN v$statname n ON c.statistic# = n.statistic# LEFT JOIN v$sql q ON s.sql_id = q.sql_id WHERE n.name = 'opened cursors current' AND c.value > 200 ORDER BY c.value DESC;
Corrija aplicações que não fecham cursores adequadamente.
Exemplo Prático: Tuning de Cursores
Cenário: Relatórios AWR mostram alta taxa de soft parsing e erros ORA-01000
. O valor atual de OPEN_CURSORS
é 300, e SESSION_CACHED_CURSORS
é 50.
Verificar Uso de Cursores:
SELECT s.sid, s.username, COUNT(*) as open_cursors FROM v$open_cursor oc JOIN v$session s ON oc.sid = s.sid GROUP BY s.sid, s.username HAVING COUNT(*) > 200 ORDER BY open_cursors DESC;
Resultado: Sessões atingem ~280 cursores.
Ajustar OPEN_CURSORS:
ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;
Analisar Soft Parsing no AWR:
Se "Parse Calls" for alto, aumente
SESSION_CACHED_CURSORS
:ALTER SYSTEM SET session_cached_cursors = 150 SCOPE=BOTH;
Otimizar Consultas:
Identifique consultas com literais fixos:
SELECT sql_text, parse_calls FROM v$sql WHERE parse_calls > 100 ORDER BY parse_calls DESC;
Modifique para usar variáveis de ligação.
Monitorar Resultados:
Gere um novo relatório AWR e verifique:
Aumento no "Cursor Cache Hit Ratio".
Redução em "Parse Calls".
Eliminação de erros
ORA-01000
.
Boas Práticas de Tuning
Baseie Ajustes em Dados: Use AWR, ADDM e visões dinâmicas para determinar valores apropriados para
OPEN_CURSORS
eSESSION_CACHED_CURSORS
.Evite Valores Excessivos: Configurações muito altas (ex.:
OPEN_CURSORS
> 5000) podem mascarar vazamentos de cursores e aumentar o consumo de memória.Teste em Homologação: Aplique mudanças em um ambiente de teste antes de produção.
Monitore Continuamente: Configure alertas para uso elevado de cursores e revise relatórios AWR regularmente.
Integre com Outras Otimizações: Combine o ajuste de cursores com gerenciamento de índices, estatísticas atualizadas e tuning de consultas.
Ferramentas de Suporte
AWR: Identifica problemas de parsing e uso de cursores.
ADDM: Sugere ajustes em parâmetros e otimizações.
SQL Tuning Advisor: Recomenda melhorias em consultas que geram muitos cursores.
Enterprise Manager: Facilita monitoramento e ajustes via interface gráfica.
O ajuste de cursores é uma prática fundamental para otimizar o desempenho do Oracle Database. Configurações inadequadas podem levar a gargalos de performance, enquanto ajustes bem planejados melhoram a eficiência do parsing e reduzem o consumo de recursos. Combine monitoramento rigoroso, ajustes baseados em evidências e otimizações na aplicação para alcançar um ambiente estável e eficiente.
Subscribe to my newsletter
Read articles from Sergio Bender directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by