Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: cArqTab :: Otimizando a Abertura do Sistema: Como a Escolha do Método de Carregamento Afeta o Desempenho

_Créditos da imagem: Gerada com auxílio do ChatGPT_ # cArqTab :: Como o carregamento de informações em uma variável pode tornar lenta a abertura do sistema TOTVS Microsiga Protheus --- # Comparando LoadFromDBQuery e LoadFromDBWhile: Vantagens e Desempenho No desenvolvimento de soluções para o TOTVS Microsiga Protheus, otimizar o tempo de execução das funções é essencial, especialmente quando lidamos com grandes volumes de dados. Neste artigo, vamos analisar a diferença de desempenho entre os métodos `LoadFromDBQuery` e `LoadFromDBWhile`, utilizando os tempos de execução para demonstrar a vantagem de cada abordagem. ## Contexto do Teste Para avaliar o desempenho, executamos dois procedimentos distintos: - **U_TSTArqTabLoadDBQuery**: utiliza a função `LoadFromDBQuery`. - **U_TSTArqTabLoadDBWhile**: utiliza a função `LoadFromDBWhile`. Os comandos foram executados no ambiente Cygwin, e PowerShell e os tempos foram medidos da seguinte forma: *Cygwin ```bash $ time C:/totvs/tst/sma

Protheus :: Advpl :: Dicas do Robson :: Usando UniqueKey() para filtrar registros

Função: UniqueKey( <uFields> , <cAlias>, <lResetKeys>, <nMaxRec> )

Objetivo: Verificar se a chave passada é única de acordo com o campo ou campos passados nos parâmetros. Esta função ajuda a apresentar um único registro quando houver vários semelhantes, por exemplo: Fazer consulta SXB na tabela SC7, porém apresentando um registro por pedido de compra independente de quantos itens existam.

Parâmetros:

uFields – String contendo o campo ou Array  unidimensional com as strings dos campos que que serão considerados para pesquisa da chave única.

cAlias – Alias do arquivo para pesquisa.

lResetKeys – Reinicializa as chaves.

nMaxRec – Número máximo de elementos.

Essa mesma dica poderá, por extensão, servir ao fitro do MPSDU/APSDU como abaixo:

!Deleted().and.C7_EMISSAO>=FirstDate(Date()).and.C7_EMISSAO<=LastDate(Date()).and. UniqueKey({"C7_FILIAL","C7_NUM"})

Irá retornar todos os primeiros n registros da tabela SC7, não deletados, com a data de emissão dentro do mês corrente.

Dada a característica da Função UniqueKey() o intervalo de dados não poderá ser muito grande por dois motivos

  • Performance;
  • Tamanho máximo da “Pilha” de armazenamento;

Logo, para tabela com muitos registros, uma condição complementar deverá ser utilizada como filtro “primário” e excludente.

Exemplo:

image

Filtrando com:

!Deleted().and.C7_EMISSAO>=FirstDate(Date()).and.C7_EMISSAO<=LastDate(Date()).and. UniqueKey({"C7_FILIAL","C7_NUM"})

teremos:

image

image 

Uma outra dica, para melhorar a performance do filtro usando UniqueKey() é selecionar uma Chave de índice que corresponda ao filtro desejado. No nosso caso C7_FILIAL+C7_NUM…

E, como bem dito pelo Robson, além de podermos utilizar UniqueKey() para Filtrar informações via MPSDU/APSDU podemos utilizá-la para filtrar uma Consulta Padrão.
 
Observe:
 
Sem o Filtro
 
image
 
image
 
 
Aplicando o Filtro:
 
C7_EMISSAO>=FirstYDate(Date()).and.C7_EMISSAO<=LastYDate(Date()).and. UniqueKey({"C7_FILIAL","C7_NUM"})
 
 
image
 
image
 
Obteremos apenas os n Primeiros registros que atendam a condição.
 
p/ Robson Luiz (feat иαldσ dj)
 
[]s

Comentários

Postar um comentário

Postagens mais visitadas