Olá pessoal!
Hoje vamos falar sobre duas funções ADVPL que são muito utilizadas, a GETMV e a SUPERGETMV, muito se fala sobre a usabilidade e melhores práticas em desenvolvimento, porém não é muito explanado sobre a sutil diferença que existe entre funções que nos levam ao mesmo fim, isso acontece com o uso da GetMV e SuperGetMV, com o uso da FWTemporaryTable e a CriaTrab, GetNextAlias e CriaTrab(.f.)… Mistérios pairam sobre o que de diferente acontece em cada uma delas e quando usar uma ou outra.
Conforme a linguagem vai amadurecendo e outras tecnologias são envolvidas no uso do sistema, e aí é que se faz necessário aperfeiçoar algumas funções, chamamos isso de refatoramento. O Refatoramento é uma poderosa arma para driblar GAPs de performance e utilizar melhor a alocação de recursos de Hardware dos servidores e computadores.
Mais vamos ao que interessa de fato não é mesmo? A sutil, porém não tão sutil assim, diferença entre as funções GetMV e SuperGetMV.
As principais diferenças estão em novas usabilidades na SuperGetMV, são elas:
- Possibilidade de uso de um parâmetro que não existe na base de dados;
- Melhoria de performance relacionada ao uso de Cache;
- Problema ocasionado pelo uso de cache;
Agora vamos nos aprofundar ainda mais nestas diferenças.
Dizendo a respeito da possibilidade de uso de um parâmetro que não existe na base de dados, acredito eu, que este seja o principal motivo para utilizarmos tanto a SuperGetMV, uma vez que, após a atualização gerada pela Refatoração do GetMV agora podemos passar por parâmetro um MV que não existe na base de dados e também passar o seu conteúdo Default, para caso ele não exista não gerar Error.log para o cliente. Este recurso gerado pela refatoração nos trousse também uma minimização de codebase, uma vez que antes teríamos que checar se o que foi trazido pela GetMV era de fato o que esperávamos para uso, se não, era gerado aquele textinho bonito e que todos tememos ver em nossos ambientes não é mesmo?
Agora, falando a respeito da melhoria de performance relacionada ao uso de cache, haja vista que houve uma pequena, porém, perceptível melhoria nos processamentos de laços e arrays multidimensionais ou não, quando você não tem cache é necessário acionar o dicionário de dados, todas as vezes e retornar este dado, por conta disso é necessário mais milissegundos para retornar uma mesma informação. Você sabe como é o comportamento por trás desta ação e quantos milissegundos é necessário? Quando acionamos um dado, seja ele em arquivo (dtc,dbf) ou em banco de dados é adicionado um tempo de milissegundos de resposta, uma vez que o CPU precisará processar este dado e nos retornar, sendo assim, quando usamos a cache, o dado processado e já com a resposta, é retirado do roteiro estes milissegundos a mais que adicionamos, isto pode parecer pequeno, porém pense 1 milissegundo a mais em 100 acionamentos versus 1 milissegundo a mais em 10.000 acionamentos, não é o mesmo não é verdade? Daí vem a resposta para uma das questões já ditas aqui, QUANDO USAR UMA OU OUTRA? É necessário avaliarmos o que vamos fazer com este dado, pois ainda temos mais uma diferença, o problema ocasionado pelo uso da cache.
O problema que é ocasionado pelo uso da cache diz respeito apenas a usabilidade e sem correlacionar a tecnologias por trás, porque ao não ler o aquivo ou dado em tempo de execução, podemos “perder” alguma alteração que nele foi feito, enquanto estivermos usando uma cache que não foi limpa e refeita o dado processado terá sempre o mesmo valor. Isto é muito bom para por exemplo, um dado a respeito de um URL da Receita Federal, que raramente muda, ou o tamanho de um determinado dado.. enfim muitas possibilidades existem para dados que não serão frequentemente alterados. Mas, existe algumas possibilidades que não são tão remotas assim, por exemplo, a numeração de um sequencial que pode ser usado em um parâmetro, da qual você utiliza em mais de um Thread, sendo assim a thread A terá apenas o conteúdo em cache de quando ela entrou em processo, já a Thread B por exemplo pode ter alterado este conteúdo e isso ocasionará um problema caso a thread A tenha tido uma queda abrupta, não ficando assim em sequencia de fato esta numeração sequencial.
Sobre a resposta a pergunta quando usar uma ou outra? Avalie qual será o dado retornado e em que você irá utlizá-lo, para assim saber se você poderá ou não utilizar o cache provisionado pela SuperGetMV sem que você perca dados importantes para aquele processo.
E aí, já sabia sobre esssas diferenças?