Limites do AdvPL – parte 02

Introdução

No post anterior, vimos alguns limites como o limite de Strings em AdvPL, e limites de precisão numérica. No post de hoje, veremos alguns limites já publicados oficialmente na TDN, porém vamos ver também as “entrelinhas” destes limites. Vamos partir de alguns limites documentados na TDN, no link http://tdn.totvs.com/pages/viewpage.action?pageId=25165915

Tabela de Dados

Uma tabela na base de dados possui diversos limites que podem ser atingidos, não somente número de campos por tabela ou número de registros. Por exemplo, atualmente o Protheus ainda dá suporte ao formato DBF (até Protheus 11, para as versão 32 Bits do APPServer), e arquivos da RDD CTREECDX (c-Tree Microsiga Edition, da Faircom), e da RDD TOPCONN 00 armazenados em bancos relacionais homologados, acessados através do DBACCESS. Para cada banco de dados Homologado, existem limites intrínsecos do SGDB. Por exemplo, o AdvPL suporta até 1000 campos por tabela, porém além de não ser uma boa pratica colocar tantos campos na mesma tabela — é preferível fazer uma normalização), existe um limite de tamanho de registro. Se eu não me engano, em uma linha de dados, considerando apenas os tipos CDNL (Caractere, Numérico, Data e Lógico), o limite de tamanho de registro dos bancos relacionais homologados não ultrapassa 8 KB. Somente é possível atingir o limite astronômico de 1000 campos por tabela se a soma dos tamanhos dos campos for inferior a 8 KB. Outro limite interessante é o número de registros. A linguagem AdvPL oficialmente têm o limite de 1 Bilhão de registros por tabela, porém cada RDD possui o seu limite de armazenamento. Bancos relacionais em versão EXPRESS, além de não serem homologados oficialmente para uso com o ERP, possuem limite de tamanho da Base de Dados, e as RDDs ADS e c-Tree possuem limites acima de 4 GB, porém desde que o sistema de arquivos utilizado no sistema operacional também suporte tabelas com mais de 4 GB.

Mais limites de dados

O tamanho máximo de um campo do tipo “C” Caractere para uma tabela do AdvPL pode até chegar a 1 KB, mas não é recomendado chegar perto desse limite. O campo do tipo “M” Memo, usando a RDD TOPCONN pode ser expandido até 1 MB. Porém os limites da base de dados não param por aí … Para a criação de índices, cada SGDB / RDD homologada possui um limite de índices por tabela, um limite de campos na chave de índice, um limite de tamanho da expressão de índice e um limite do conteúdo da chave de índice. Como o ERP é homologado para diversas RDDs e SGDBs, estes limites precisam ser “nivelados por baixo” — O menor homologado prevalece. Mesmo que o SGDB que você use, e até o AdvPL aceite extrapolar algus limites, o fato de atingí-los pode prejudicar seriamente uma portabilidade de um SGDB para outro. O limite de índices é uma característica exclusiva da RDD e/ou SGDB utilizados, ainda não testei todos, mas são suportados mais que 16 índices. Porém, deve sempre ser colocado em foco que o SGDB ou RDD precisam atualizar cada um destes índices quando um novo registro é inserido, e no caso de uma aleeração de campos, cada chave de índice que contém um campo alterado será atualizada no momento de fazer um Update.Existem aplicações que podem efetivamente precisar de um número maior de índices para priorizar o desempenho na busca de dados. Porém, deve-se levar em conta que não há mágica. Mesmo sabendo que, para cada índice adicional criado existe um custo maior de manutenção dos índices, quando a velocidade de busca têm prioridade, arca-se com o custo de da manutenção dos índices para ter desempenho na busca. A expressão de índice não deve ultrapassar 250 caracteres, e o tamanho da chave (resultado da avaliação desta expressão) também não deve ultrapassar 250 bytes. Por exemplo, uma tabela com três campos caractere de 100 bytes cada, ao criarmos um índice com CAMPO1+CAMPO2+CAMPO3, a expressão de índice possui apenas 20 bytes, mas a chave resultante desta expressão vai ter 300 bytes. Existem também limites do AdvPL, colocados para que um único processo não cometa “exageros”, como por exemplo o limite de registros em estado de LOCK simultâneos mantidos pelo mesmo processo (Soma de todos os locks mantidos em todas as tabelas abertas em um processo, independente da RDD). Este limite é fixo em 10000 registros, mas em casos realmente especiais pode ser alterado mediante configuração especifica no APPServer. O número de arquivos (ALIAS) abertos simultaneamente também tem um limite no AdvPL. Até o Protheus 10, o limite eram 250 alias abertos. Para o P11 e versões superiores, o limite default foi aumentado para 1024 ALIAS. Quando usamos a RDD TOPCONN, podemos submeter Queries ao SGDB, porém existe um limite de colunas de retorno, fixo em 250 colunas. Parte-se do princípio que, se você precisa de mais de 250 colunas em uma Query, você precisa rever seus conceitos e mudar a abordagem do seu algoritmo.

Memória e Runtime

Os limites de memória são muito interessantes. Alguns são intrínsecos a plataforma (Versão e Plataforma do Sistema Operacional) e a versão do executável do APPSErver (32 ou 64 bits), e outros limites são intrínsecos da linguagem. Têm um artigo na TDN, no link http://tdn.totvs.com/pages/viewpage.action?pageId=6065041, dedicado a explicar melhor alguns destes limites. As variáveis de memória possuem limites bem grandes. Podemos ter programas com até 4096 variáveis, e no caso de Arrays no AdvPL, os limites foram bem esticados. O limite de dimensões de um Array, embora esteja documentado como “ilimitado”, não ultrapassa 32 mil dimensões — um número praticamente inatingível, a menos que o programa esteja fazendo algo de errado; Já o número de linhas de Array, originalmente 4096, foi “esticado” para 100 mil, porém isto pode comer memória com farinha, e como uma instância do APPServer têm um limite de alocação de memória na camada do Sistema Operacional, caso mais de um processo que consuma muita memória seja executado no mesmo APPServer, isto pode atingir o limite do processo e derrubar o APPSErver. O número de procedimentos e funções por programa também foi documentado como “ilimitado”, quando na verdade o termo correto seria “inatingível”, somente um programa muito absurdo conseguiria declarar, dentro do mesmo fonte, mais de 32 mil funções, sem estourar o limite de 1 MB de texto para um arquivo fonte em AdvPL (extensões PRG, PRW ou PRX). O limite para empilhamento de funções no AdvPL (função que chama função que chama função…) é de 250 chamadas empilhadas, e este limite é realmente grande. Utilizando-se de outras abordagens de algoritmo, é possível implementar recursividade no código sem aumentar a pilha de chamada de funções. A nomenclatura das variáveis no AdvPL ainda é de 10 caracteres, ignorando os demais caracteres excedentes. Logo, você pode declarar uma variável nomeada “cNomeDaCidade”, e na hora de recuperar o valor desta variável, chamá-la de “cNomeDaCid”, ou vice-versa, pois somente os 10 primeiros caracteres do nome são significativos. Da mesma forma, nomes de funções, classes e métodos de classes também estão sujeitos por compatibilidade ao limite de 10 caracteres significativos. Por isso, cuidado ao nomear USER FUNCTIONS, pois o prefixo USER FUNCTION é traduzido para “FUNCTION U_”, usando dois caracteres do nome da função, deixando apenas 8 caracteres para você efetivamente nomear a função.

Outros limites

O sistema de arquivos utilizado pelo sistema operacional também possui limites, normalmente bem acima do recomendado pelas boas práticas de programação e estruturação de sistemas, como limites de nome de arquivo (considerando o path completo ), no NTFS ( Windows ) por exemplo é perto de 250 caracteres. Pode existir também limite de arquivos por pasta, mas normalmente são suportados facilmente 32 mil arquivos ou mais — porém chegar perto destes limites pode tornar as operações de busca e manutenção no sistema de arquivos muito lentas dentro destas pastas.

Conclusão

Saber quais são os limites da ferramenta que você escolhe são fundamentais quando falamos em unidades como “Terabytes” de dados e volumes consideráveis de processamento. Porém, deve-se sempre levar em conta que, normalmente não é boa prática chegar perto de alguns destes limites. Isso pode exigir um custo maior em projetar e desenvolver um algoritmo, mas definitivamente isso pode representar ganhos significativos em escalabilidade, desempenho e portabilidade. “Não existe pedra tão grande que não possa ser triturada em um moedor de carne. Basta quebrar a pedra maior em pedras menores sucessivamente, até você obter pedaços que caibam no moedor :D” Até o próximo post, pessoal 😉

17 respostas em “Limites do AdvPL – parte 02

  1. Se o limite de tamanho de um campo caracter é de 1 K (1024 posições) por que o configurador não permite valores superiores à 250 (ou 260 não me lembro) posições?

    Curtido por 1 pessoa

    • Iuspa, bom dia,

      De cabeça, eu não lembro exatamente qual o SGDB, mas um dos bancos homologados não suporta uma constraint default varchar() superior a este tamanho, mesmo que o campo suporte o valor maior. Por isso, foi convencionado para o ERP não permitir campos caractere maiores que 250 posições. Para possibilitar a portabilidade entre ambientes, o ERP precisa “nivelar” por baixo estes limites. 😉

      Curtido por 2 pessoas

  2. “Não existe pedra tão grande que não possa ser triturada em um moedor de carne. Basta quebrar a pedra maior em pedras menores sucessivamente, até você obter pedaços que caibam no moedor :D” — podemos deixar isso um pouco melhor, afinal moedor de carne não foi feito para quebrar pedras … risos … a pedra vai quebrar o moedor.

    “Tão há tarefa tão grande que não possa ser estimada ou completa. Basta dividí-la em sub-tarefas, até que seja possível mensurá-las e as torne factíveis de serem realizadas :D”

    Curtido por 1 pessoa

  3. “Não é recomendável ter mais que 15 índices para uma tabela”
    Tabela SRA/SE1/SE2/SE5 passa desse limite por padrão !

    250 chamadas empilhadas.
    Ultima vez tava estourando com 18x chamadas (recursiva)+-. Por que na pilha as funções de sistema. A soma dava umas 200.
    Solução é recursiva com while para não aumentar a pilha, você posto um exemplo em uma função sua.

    Funções recursivas em AdvPL

    Curtido por 1 pessoa

  4. Bem lembrado … e, aproveitei pra corrigir uma errata naquele post: Lá o limite de Stack no AdvPL mencionava 100 níveis, e o valor correto são 200 níveis.

    Falha minha ao enfatizar uma recomendação por um valor quantitativo absoluto. Existem aplicações que podem efetivamente precisar de um número maior de índices para priorizar o desempenho na busca de dados. Porém, deve-se levar em conta que não há mágica. Para cada índice adicional criado existe um custo maior de manutenção dos índices, mas quando a velocidade de busca é prioritária, arca-se com o custo de uma ponta para ter desempenho na outra 😉

    Curtir

    • O limite de 10 caracteres é legado, o formato DBF do DBase já limitava variaveis e campos em 10 caracteres, o Clipper idem, e como o AdvPL com Protheus foi feito para rodar ese código legado, este paradigma ainda foi mantido.

      Não existe previsão para a alteração deste paradigma, mas posso lhe dizer que isto está no “radar” do departamento de Tecnologia & Inovação 😉

      Curtido por 2 pessoas

  5. Muito bom o post. Essa questão da User Function perder 2 caracteres eu não sabia…agora sei o motivo de alguns erros…kkkkkkkk

    E como disse o colega acima, está na hora de podermos usar nomes maiores em campos. Isso é uma das coisas que eu sinto mais falta no Protheus.

    Obrigado pelo e post e por favor, escreva mais!

    Curtido por 1 pessoa

  6. Parabéns pelo excelente trabalho Júlio, estou sempre acompanhando seu blog e gostaria de pedir um post sobre Motor Job, visto que é muito difícil material sobre isto, estou apanhando para entender o uso dele em algumas customizações… Abraços.

    Curtido por 1 pessoa

    • Olá Lucas, obrigado !

      O que seria esse ‘Motor Job” ? É algum componente do FrameWork AdvPL ou a sua dúvida é sobre o mecanismo de Jobs do TOTVS Application Server ? ( StartJob )

      Abraços

      Curtir

  7. Gostaria de saber quem inventou este “Motor Job”, onde eu trabalho para minha operação.

    A Totvs desconhece o produto, não tem documentação e não é possível abrir chamado.

    Só sei que é uma classe Advpl que faz processos em background.

    Curtido por 1 pessoa

  8. Uma boa notícia direto de 2023.

    Acabei de gerar um Array pré-gravação (Leitura de Arquivo Excel) e resolvi testar…

    Foram geradas cerca de 205k linhas (com 12 colunas)

    O único quesito foi o de que o AppServer comeu 700mb de ram pra “Processar” estas informações…

    Se tiver dicas de como deixar mais eficaz … Como é uma informação de 120 linhas pra cada linha do excel, pensei em Ler uma linha e gravá-la no banco… Mas não sei …

    Curtido por 1 pessoa

Deixe um comentário