2007-01-10

O custo de verificar a não duplicação de chaves

Hoje descobri que, segundo um artigo de http://www.jlcomp.demon.co.uk/, no caso de termos uma constrainst de unique_key e desta ser violada num statement o Oracle irá efectuar um select de modo a descobrir o nome da constraint para dar o erro
ORA-00001: unique constraint (<constraint_name>) violated.
No caso de somente usarmos um index (unique key) para além desse select será efectuado outro para detectar o nome do indice respectivo que foi violado.
O autor logicamente chega à conclusão que é melhor em termos de performance ter constraints associadas aos índices.
Uma outra "descoberta" é que um insert que dá erro de constraint realmente faz os seguintes passos:
  • efectua um insert da linha completa
  • actualiza os indices por ordem de criação (é então sugerido que os indices sejam criados por probabilidade de darem erro, ou seja PK e UK anteriormente a os outros)....falha
  • redo do insert (que implica redo dos indices que tenham sido actualizados)
Minha conclusão: A importância desta informação depende do sistema. Alguns programadores preferem verificar no cliente a existência de colisão de uma futura inserção (via select 1 into L_verify from tabela where key=:p_nova_key) antes de tentarem inserir ou fazer update.
Outros preferem fazer o insert e no caso de lançamento de exception de DUPLICATE_KEY fazer update e outros o MERGE.

É necessário fazer testes no sistema para verificar qual será mais eficaz no caso da performance ser um problema.
Em termos de leitura o MERGE e o modo da exception são mais compreensivos.

No comments:

Post a Comment

Os comentários são moderados.
The comments are moderated.