Olá colegas.

* Ambiente:
Oracle 10g + Linux
(não tenho detalhes da máquina servidora, mas sei que é um quadriprocessado,
ambiente de produção, com bom desempenho).

* O problema:
Preciso fazer uma trigger after update na tabela WF_NOTIFICATIONS do Oracle
Workflow.
Neste ambiente, a tabela é particionada, possui algo em torno de 200 milhões
de registros, e tenho os índices que preciso para as consultas.
Alguns registros são identificados como pertencentes a um mesmo 'grupo' por
uma coluna GROUP_ID de mesmo valor.
Quando um registro mudar a coluna STATUS de 'OPEN' para diferente de 'OPEN',
preciso verificar se ainda existe algum outro registro do mesmo GROUP_ID que
esteja 'OPEN'.
Caso não, preciso realizar um delete deste GROUP_ID em outra tabela que não
é do produto Oracle, para fins de manutenção, de forma a impedir que esta
outra tabela creça mais que o necessário.

a) Não posso fazer uma consulta na própria tabela wf_notifications, pois
terei problema de tabela mutante.

b) Não gostaria de fazer uma procedure de transação autônoma para não correr
o risco de realizar o delete mesmo caso ocorra alguma exceção e o update na
wf_notifications seja cancelado.

c) Pensei em criar um JOB com a chamada para a procedure que realiza a
verificação e o delete, agendado para alguns minutos depois, tempo
suficiente para o commit na wf_notifications ser realizado. Isso me serve.

create or replace trigger trg_sgpd_wfno_categ_atividades
after update
on wf_notifications
referencing old as reg_antigo new as reg_novo
for each row
when (reg_antigo.status = 'OPEN' and reg_novo.status <> 'OPEN')
...

d) Também estou cogitando como alternativa rodar um procedimento a noite,
que faça a varredura da tabela onde quero deletar, que é muito menor, e
verifique se cada registro pode ser deletado.
Mas isso não vai ser performático (fullscan na tabela a deletar) se forem
mantidos muitos registros com status 'OPEN' na tabela principal. Em média,
hoje tenho 50mil registros nestas condições, ou seja, que estão 'OPEN' na
tabela do Workflow e portanto devem existir na tabela adicional, o que já
acho considerável.

* Minhas dúvidas:

1) Trata-se de um ambiente de produção grande, com muitos acessos
simultâneos. Corro o risco de criar algum tipo de degradação da performance
inundando com vários jobs seguidos?
Não tenho prática de administração.... que parâmetro devo inquirir os
administradores do ambiente para saber o máximo número de Jobs que o BD pode
suportar? (Este número é de Jobs executados ou de Jobs rodando simultâneos?)

2) Supondo que a solução de agendar Jobs esteja ok, tenho vantagens em
utilizar a DBMS_SCHEDULER ou posso utilizar a DBMS_JOB para criar o JOB ?

3) Recomendam alguma outra solução alternativa?


Estava lendo as recomendações em
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96590/adg13trg.htm#786e
http://asktom.oracle.com/tkyte/Mutate/index.html e não cheguei a uma
avaliação de qual seria a solução indicada para minha situação.

Agradeço por opiniões.

Atenciosamente,
Luís Fernando Heckler


[As partes desta mensagem que não continham texto foram removidas]

Responder a