Temos um data warehouse Oracle Database com uma média de 120 confirmações por segundo (de acordo com o AWR). A principal atividade de espera é a sincronização do arquivo de log, o que é esperado... Por enquanto, os tempos de resposta gerais são satisfatórios, no entanto, estamos preocupados com a escalabilidade daqui para frente.
Infelizmente, devido à natureza da grande maioria dessas transações, a correção usual de "alterar seu aplicativo para confirmar com menos frequência" não é uma opção.
Estamos pensando seriamente em mudar esses commits para commits em lote assíncronos via:COMMIT WRITE BATCH NOWAIT;
Certamente estamos cientes de que isso seria quebrar o "D" no ACID, ou seja, que as transações confirmadas poderiam ser perdidas no caso de uma falha na instância. No entanto, a maioria dos commits mencionados acima são informações de registro em que, se perdermos uma transação aqui e ali devido a uma falha na instância, as consequências dessas transações perdidas são mínimas.
Eu entendo que com commits nowait em lote, os commits são armazenados em buffer no buffer de log (que podemos ajustar por meio do parâmetro init log_buffer, se necessário). No entanto, não consigo encontrar respostas para as seguintes perguntas:
1) Os commits em lote abrangem várias conexões? Em outras palavras, se nós:
open a connection
do work
commit write batch nowait;
close the connection
open another connection
do work
commit write batch nowait;
close the connection
rinse, repeat...
Ambos os commits são em lote ou o Oracle libera os commits no disco para cada conexão quando a conexão é fechada?
2) Existe alguma maneira de descobrir com que frequência os commits em lote são gravados no disco e se tornam "duráveis"?
3) Os commits em lote gravados no disco são serializados? Em outras palavras: se o lote do aplicativo confirma o trabalho "A", o lote confirma o trabalho "B", o trabalho "A" é sempre gravado no disco antes do trabalho "B" ou é possível que o trabalho "B" seja gravado no disco antes que o trabalho "A" seja gravado no disco, a instância falha , o trabalho "A" é perdido, mas o trabalho "B" é durável?
Fui em frente e abri um Oracle SR, e isso é o que a Oracle tinha a dizer:
Não. O Oracle gravará dados do Buffer em redologs assim que redo suficiente for gerado pela sessão. Como sua sessão foi encerrada, o Oracle a gravará imediatamente.
Não. Eu verifiquei todos os Documentos oracle e Metalink, mas essa informação não está disponível. A documentação mais avançada sobre Asynchronous Commits está disponível neste link .
Pelo que entendi da documentação, eles são serializados. Como as transações são gravadas no disco quando o redo "suficiente" é gerado, espero que A seja gravado antes de B. Na pior das hipóteses, elas serão gravadas ao mesmo tempo. Observe que isso não é verdade com várias sessões como "A" da Sessão 1 e "B" da Sessão 2.