quinta-feira, 7 de maio de 2015

Fim da Fila


Para tabelas em que se optou não utilizar o autonumber para gerar o valor da chave primaria numérica, e claro incremental, temos algumas saídas para obter o ultimo valor registrado.

Como a adoção do algoritmo depende de uma opção do próprio desenvolvedor, melhor estudar os modelos, que apresentam características distintas em termos de complexidade de programação e também desempenho, para que possamos optar por uma solução eficaz.

Para testar os modelos realizei um teste em uma tabela com 9000 registros, e uma única interface que implementa os três métodos de forma a manter a mesma regularidade de operação, e também para se obter uma medida de desempenho, através da medição do tempo de resposta. Esta medição foi realizada marcando-se o tempo entre o inicio da chamada ao servidor até o retorno completo da resposta ao navegador, portanto, não referem-se especificamente ao algoritmo em si, mas ao contexto da pesquisa em uma interface real, e para garantir um numero mais amadurecido descartamos o maior e o menor valor auferido, e calculamos a média da série, e os resultados foram:

1) Usando a Fórmula MAX


    &ClienteId = max(ClienteId) + 1

Nesse modelo, uma fórmula MAX aponta para a tabela alvo, e retorna o valor maximizado do identificador, ou seja, o maior indicador inserido na tabela, em outras palavras, o último registro.  Na media este modelo gerou um tempo de 6,3 milissegundos para a tabela de 9000 registros.

2)  Percorrendo a tabela toda

    for each
        &ClienteId = ClienteId
    endfor
    &ClienteId+=1


Neste, o que temos é um for each que percorre toda a tabela, e como a tabela é ordenada pela chave primária em ordem crescente, o último registro define o último identificador. Este foi o pior modelo, pois na media gerou um tempo de 56,3 milissegundos.

3) Ordenando e pegando o ultimo registro

    for each
    order (ClienteId)
        &ClienteId = ClienteId
        exit
    endfor
    &ClienteId+=1


Neste modelo, pega-se o último registro da tabela por meio da ordenação do identificador em ordem decrescente e um exit que encerra o laço já no primeiro registro recuperado.  Este modelo apresentou o melhor desempenho com um tempo de 5,3 milissegundos.

Portanto, se você percorre a tabela toda para obter o ultimo identificador gerado, você esta gastando uma energia imensa do processador + memoria para alcança-lo, aproximadamente 10 vezes mais, se comparado com os outros dois outros métodos, que apresentam desempenhos semelhantes.

Resumo: Tempo em milissegundos

Método 1 6,333333
Método 2 56,33333
Método 3 5,333333

Analisando a proposta 1) e 3) observamos que apesar da primeira perder alguns milisegundos, é uma forma bem interessante pois o código é mais simples e muito mais sintético, ou melhor, a que apresenta o melhor custo x beneficio.

Nos pequenos detalhes está a qualidade.