Dicas sobre o banco de dados do Protheus(Totvs)

Publicado: 12 de setembro de 2012 em Administração, SQL Server, Virtual PASS BR
Tags:, , , ,

Olá pessoal,

Dias atrás meu amigo Leandro Ribeiro (blog | twitter) solicitou no Twitter dicas sobre o banco de dados do Protheus e como eu presto consultoria em banco de dados e muitos dos clientes trabalham com esse produto, resolvi compartilhar essas dicas para quem está começando agora a atuar com esse produto.

Para quem não conhece o Protheus é um ERP desenvolvido pela fabricante TOTVS e é um dos líderes de mercado no Brasil. Um diferencial do Protheus é que além dele atender diversos ramos de atividade do mercado brasileiro ele pode ser totalmente customizável. Muitos dos problemas de performance que ocorrem no banco de dados do Protheus está relacionado as customizações.

Vamos as dicas:

  1. Quase sempre o banco de dados se chama DADOSADV ou pelo menos começa com DADOS, isso não é uma regra mas é o que eu costumo encontrar em meus clientes;
  2. A aplicação não acessa o banco de dados diretamente ela usa uma camada intermediária chamada Top Connect. O Top quase sempre é instalado no mesmo servidor que o banco de dados, porém há casos em que ele é instalado em uma máquina exclusiva e então a aplicação se conecta ao Top e o Top faz a conexão com o banco de dados. Devido a essa camada intermediária entre aplicação e banco de dados o Protheus trabalhar com várias tecnologias de banco de dados;
  3. O Protheus é um produto multi empresa, porém ao contrário do que estamos acostumado a ver nas modelagens onde a empresa é distinguida por um campo  identificador, no banco de dados do Protheus para cada empresa será criada uma tabela de produto, uma de cliente, uma de nota fiscal e assim suscetivamente até a versão 10 do Protheus. Imaginem isso para uma holding com mais de 100 empresas.
  4. A partir da versão 11 do Protheus é possível criar as empresas dentro da mesma tabela o que diminui significativamente o número de tabelas dentro do banco de dados.
  5. O nome das tabelas não ultrapassam 6 caracteres e são representados da seguinte maneira:
    • 3 primeiros caracteres representa a família da tabela.
      • Ex: SA1(Cliente) ou SA2(Fornecedor)
    • 2 próximos caracteres representa a empresa que a tabela pertence.
      • Ex: 01(empresa 1), 02(empresa 2) ou 99(empresa 99)
    • O último caractere é reservado ao sistema.
  6. A chave primária das tabelas é sempre o mesmo que é o R_E_C_N_O_ e é auto incrementado pelo próprio Top Connect;
  7. Os registros das tabelas nunca são deletados fisicamente. Todas as tabelas contém um campo chamado D_E_L_E_T_ e quando um registro é excluído no sistema, esse campo é preenchido com um literal “*”.
    • Dica: Ao fazer um SELECT lembrem-se de colocar na condição where D_E_L_E_T_ = ” ou D_E_L_E_T_ <> ‘*’
  8. Não existe campo DATETIME nas tabelas. Todos os campo data são VARCHAR(8), nunca são nulos e são sempre preenchidos com 8 caracteres em branco para informar que estão vazios;
    • Devido esse comportamento a compressão de dados vai muito bem 🙂
  9. Não existe valor NULL. Se o campo for numérico ele é preenchido com zero e se for String/Char é preenchido com espaços em branco. Em ambos os casos o preenchimento é feito via Constraint Default. Agora imaginem a quantidade de Constraint que cada tabela tem;
  10. Muito cuidado ao criar índices nas tabelas, pois se você criar em uma terá que criar em todas, por exemplo: Se criar um índice na tabela de cliente SA1XX0 lembre-se de replicar esse índice para as demais tabelas de cliente caso tenha;
  11. O Protheus trabalha com um dicionário de dados próprio onde são definidas as tabelas, campos e índices então em uma atualização de versão é feita uma checagem do dicionário de dados com a estrutura do banco de dados e tudo que não estiver definido no dicionário será apagado, seja campo, índice ou tabela, portanto ao criar um índice utilizado em um trabalho de Tuning é recomendado criar uma rotina que revalide se os índices customizados existem e caso não exista  recrie-os.
  12. Caso seja um campo em uma tabela sem estar no dicionário de dados do Protheus, ao abrir uma tela que use a tabela onde o campo foi criado, essa tela irá travar por não existir o campo no dicionário, portanto muito cuidado;
  13. O desempenho das queries do Protheus não é o forte da ferramenta, então há muita oportunidade de Tuning;
  14. Uma forma de ganhar espaço em disco com o banco do Protheus é usar a compressão de dados a nível de página caso o SQL Server seja Enterprise. Em testes realizados na tabela SB1(Produtos) com 28000 produtos, comprimindo apenas a tabela passou de 72 MB para 6 MB, ou seja, uma taxa de compressão de 91.66%;
  15. Os bancos geralmente são enormes então é válido pensar em uma estratégia de particionamento das tabelas, para facilitar o gerenciamento;
  16. Índices não utilizados para leitura e duplicados é quase uma regra, então é válido fazer uma análise dos índices que não são utilizados para leitura e alinhar com o time de desenvolvimento.
    • Nunca apague um índice sem antes apagar no dicionário, pois as telas fazem essa verificação também em sua abertura e caso não encontre no banco as telas irão travar;
  17. O Top Connect não funciona em cluster devido ao hardlock que é quem licencia o Protheus e como em alguns casos ele é instalado no mesmo servidor do banco de dados, não será possível colocar ele no Service and Application do Cluster e quando ocorrer um Failover será necessário reiniciar o servidor de licença que normalmente está em outro servidor;
  18. Não é possível fazer uma replicação merge das tabelas, devido fato da replicação merge adicionar um campo de controle de unicidade chamado rowguid e caso tenha um campo na tabela do banco e não tenha no dicionário do Protheus isso causa sérios impactos. Mesmo que não houvesse o impeditivo do campo rowguid, muitas tabelas ultrapassam 246 colunas e seria impossível replicar com merge devido o limite de 246 colunas por artigo;
  19. Devido o padrão das tabelas do Protheus não terem campos NULL e todos serem preenchidos com uma Constraint Default isso impede que as tabelas sejam colocadas In-Memory;
  20. Normalmente os bancos são muito grandes, então a rotina de manutenção de índices se torna uma tarefa árdua e difícil. Para esses casos eu costumo usar as rotinas de manutenção do Ola Hallengren.

Espero que essas dicas sejam úteis. Conforme eu for me lembrando de mais coisas eu vou atualizando o post.

Até mais.

Anúncios
comentários
  1. Mateus disse:

    Vale lembrar que índices criados pelo microsiga não utilizam o INCLUDE e, por isso, ao analisar planos de execuções das consultas a presença de KEY LOOKUPS é muito comum. É sempre válido identificar e reduzir os key lookups com índices cobertos.

  2. […] Clique aqui para ir ao POST original… Todos os méritos do Post ao Sr. Marcel Inowe Gostar disso:GosteiSeja o primeiro a gostar disso. CategoriasBanco de Dados, Desenvolvimento, Emprego, Virtual PASS BR Tags:Totvs; ERP Comentários (3) Trackbacks (0) Deixe um comentário Trackback […]

  3. Alexandre Thiel disse:

    Marcel,

    Aquela parte onde você diz: “se a empresa tiver 1 matriz e 9 filiais o banco de dados terá 10 tabelas para funcionário, 10 tabelas para cliente, 10 tabelas para produto e assim suscetivamente” não está correta.

    O controle de filiais é feito dentro das tabelas, logo, uma empresa com 9 filiais (se forem cadastradas no sistema como filiais) terá apenas uma tabela para cada cadastro.

    Agora se forem 10 empresas, ai sim, teremos 10 tabelas diferentes para cada cadastro.

    Abraço,

    Alexandre Thiel

    • Marcel Inowe disse:

      Alexandre obrigado pela dica. Você está certo, eu me equivoquei na minha colocação.

      Abraços.

      • Bruno disse:

        Marcel, parabéns pelo post!
        Apenas uma correção, agora na versão 11 do Protheus podemos usar o novo conceito de empresa, unidade de negócio e filial, e dependendo da configuração podemos ter 10 empresas, 10 filiais para cada empresa e ainda assim utilizar uma única tabela, se for conveniente. O tratamento de compartilhamento entre filiais e empresas fica no campo _FILIAL da tabela.

        Abs

      • Marcel Inowe disse:

        Boa tarde Bruno, primeiramente obrigado pelo seu comentário.

        Muito bom saber que na versão 11 dá para fazer isso. Basta saber se os consultores Protheus vão usar esse recurso.

        Abraços

    • Luiz Carlos disse:

      Na versão 11 do Protheus isso já foi tratado, as tabelas podem ser compartilhadas em três níveis e cada jogo de tabelas se dá pela criação de um grupo de empresas, ou seja, mesmo tendo várias empresas e em vários segmentos, você ainda poderá estar trabalhando no mesmo jogo de tabelas.

  4. Márcio Lenharo disse:

    Marcel, Boa noite!

    Vc citou acima sobre estratégia de particionamento das tabelas, minhas perguntas são:

    O particionamento do SQL Server é compatível como o DBAccess?

    Existe algum procedimento especial ou diferente para aplicar o particionamento no caso do Protheus?

    Qual estratégia recomenda?

    Obrigado.

    • Marcel Inowe disse:

      Oi Marcio, obrigado pelo seu comentário.
      Respondendo suas perguntas, vamos lá:

      1. O particionamento é compatível sim com o DBAccess, pois isso é transparente para quem está acessando as tabelas no SQL Server.

      2. Não há procedimento especial algum no Protheus.

      3. É complicado recomendar uma estratégia sem ter o conhecimento do teu ambiente, mas normalmente eu particiono as tabelas de forma que procuro deixar em uma partição os dados que são mais acessados atualmente e em outras partições os dados que já não são tão mais acessados, por exemplo, se fosse uma tabela de contas a receber eu deixaria os dados de 2012 para frente em uma única partição e de 2012 para trás cada ano em uma partição, mas isso depende muito de cada caso, isso foi somente um exemplo. A vantagem do particionamento é que você pode colocar cada partição em discos diferentes.

      Abs

  5. Alexandre disse:

    Bom dia, to procurando alguem que tenha o dicionario de dados completo microsiga protheus para fazer uma integraçao com outro software vc consegue me arrumar?

  6. Cesar disse:

    Realmente utilização de recursos de banco de dados está a 30 anos luz de distância do Protheus. Qualquer programinha de fundo de quintal não usa mais a arcaica tecnologia dos DBF, com os índices muito mal planejados que esse sistema tem.
    A única vantagem pra mim é que como tem muita gente que usa, tem mais gente pra trocar experiência (não que isso seja uma enorme vantagem).
    Pra mim, a única razão desse sistema, que é lento e sempre dá pau nas atualizações, ainda existir, é porque os dinossauros que o desenvolvem têm preguiça de aprender outra linguagem e são arrogantes quando dizemos que eles estão ultrapassados… Infelizmente, o dinheiro é a mola que move o mundo…

    • Marcel Inowe disse:

      Cesar, certa vez um vendedor da Totvs me confessou que o que os fazem vender o sistema é a possibilidade do cliente customizar da forma que desejar, desde que tenha programadores. Não discordo de nada que falou no comentário, só uma ressalva de que eu conheço alguns consultores Protheus gente fina!

      Obg pelo comentário!

    • Luiz Carlos disse:

      Gostaria de conhecer um sistema que não dá problemas em uma atualização…

  7. Marcos A. Becker disse:

    Ola Marcel,
    já trabalho com vários bancos de dados há alguns anos e estou começando a explorar o Protheus, suas dicas foram preciosas, muito obrigado.
    MBecker

  8. Larissa disse:

    Para utilizar o Microsiga Photheus, meu banco de dados pode ser em Microsoft SQL Server?

    • Marcel Inowe disse:

      Boa tarde Larissa, primeiramente obrigado pelo seu comentário.

      O Protheus é um ERP que pode ser utiliza com todos os bons bancos de dados existentes no mercado. Eu não sou um especialista em Protheus mas pelo que me lembre pode-se usar com SQL Server, Oracle, DB2, PostgreSQL e MySQL, posso estar enganado mas acho que suporta Firebird e ainda suporta DBF.

      Abraços

      • Wyllian disse:

        Marcel, muito bom seu artigo.

        Mas em resposta ao comentário do dia 12 de Setembro 2013, apesar de poder utilizar o MySQL, o mesmo não é homologado para o uso da aplicação do Protheus e sim somente para o uso do Portal que faz integração com o SEFAZ (para emissão das NF eletronicas).

        Já em reposta ao Cesar no dia 20 de Maio de 2013, eu trabalho a quase 10 anos com o Totvs Protheus desde a versão 6.09. Passei por bancos DBF, CTREE, DB2 e SQL Server.

        E digo o seguinte: sim o sistema tem uma base antiguada, sim as atualizações causam uma certa dor de cabeça, mas descordo da lentidão e de alguns problemas de atualizações gerar novos Bugs do sistemas pois se isso acontece pelo simples motivo do cliente ao solicitar customização ou ter feito ela sem um acompanhamento adequado. acabou incompatibilizando o sistema.

        Vejo que nos últimos 2 anos quando surgiu a verão 11 do Protheus, o pessoal da Totvs já começou a aplicar novos conceitos, mas é claro tudo aos poucos. Não adianta querer alterar toda uma estrutura funcional de uma hora para outra, pois isso é um tiro no pé. Tenho Fé ainda que vai ficar bom mesmo com uma linguagem como é o ADVPL (CLIPPER avançado).

  9. Leo Nardo disse:

    Prezado

    No seu tópico 15, algumas considerações que gostaria de fazer, e o farei…… Me corrija se eu estiver errado….

    O Top Connect não funciona em cluster = Funciona SIM !!! O TOTVSDBACESS

    e como é preciso instalá-lo no mesmo servidor do banco de dados = Nao precisa necessariamente instalar no mesmo servidor do banco (a boa pratica seria instalar em servidor a parte para um melhor desempenho)

    e quando ocorrer um Failover será necessário reiniciar o servidor de licença que fica geralmente em outro servidor, senão ele não voltará ao ar e a aplicação não abrirá. = Existe o HARDLOCK CLONE que deve ser instalado no outro servidor e não precisa reiniciar o servidor de licença !!!

    Só para corrigir seu ótimo tópico… E como eu disse se eu estiver errado me corrija.

    Abcos

    • Marcel Inowe disse:

      Oi Leonardo eu consultei diversos consultores Totvs e todos eles me garantiram que o TopConnect não funciona em Cluster pois ele não é um serviço “clusterizável”, porém agora eu fiquei em dúvida. Para o TopConnect funcionar em Cluster tem que ter a opção de dar um nome fictício na rede para ele como acontece com o SQL Server e eu nunca achei essa opção, pois assim ao configurar o Microsiga você apontaria para esse nome fictício de rede que seria o nome que foi dado ao cluster do TopConnect. Voçê já instalou o TopConnect em Cluster e o mesmo fez o Failover automático com nome de rede fictício? Se você já fez isso gostaria que compartilhasse conosco, pois será ótimo!
      Abs

      • leonsoft disse:

        Bem… Vou dizer como eu fiz pra meu protheus, banco, licença e dbaccess funcionar com fail over.
        Coloquei cada serviço em uma VM. Se qq servidor cair a VM com Live migration assume o controle. O conceito q usei pra cluster foi este ok?

      • leonsoft disse:

        Prezado vou dizer como eu fiz pra não ter dor de cabeça com protheus, banco, licença e dbaccess. Pra cada serviço tenho uma VM. Se uma delas falha o Live migration do hiper V transfere o controle para a VM do outro servidor. Foi este o conceito q utilizei para cluster ok?

  10. Marcel Inowe disse:

    É Leonardo obrigado pela sua interação. Essa sua solução é muito interessante mas não é o Cluster que eu me refiro. Eu me refiro ao serviço do TopConnect funcionar sob o WSFC(Windows Server Failover Cluster), ou seja, deu algum problema em um dos nós o WSFC move o serviço para o outro nó automaticamente.

    Abs

  11. Kayo Hamid disse:

    Opa Marcel, estava precisando dessas informações.

    Quero efetuar uma replicação entre matriz e filiais, como vc disse que cada filial tem sua tabela, isso seria moleza.

    A questão fica em como eu faria o TOTVS App Server rodar na filial, vc tem alguma informacao para me passar nesse ponto? O TOTVS App Server eu vi que trabalha ‘balanceado’, mas cada um pode acessar um banco de dados ‘diferente’ ?

    No caso eu poderia colocar um TOTVS App Server na filial acessando o banco replicado da filial?

    Abraços.

    • Marcel Inowe disse:

      Oi Kayo obrigado pelo feedback. Na época que estava atuando constantemente eu não me recordo de nenhum serviço chamado Totvs App Server, me lembro do Top Connect. Seria o mesmo? Só um adendo é que cada empresa tem sua tabela e não cada filial, eu achei que eu já tinha corrigido, mas fui ver agora e ainda está escrito Filial. Me desculpe! Se o Totvs App Server for o mesmo que o Top Connect basta instalá-lo na filial desde que você tenha a licença, ele irá funcionar perfeitamente, porém atente-se com ambiente Protheus e replicação que é o caso da auto numeração do campo R_E_C_N_O_, pois ele é chave primária das tabelas e quem enumera ele é o Top Connect e não o banco de dados, então se a tua replicação for bi-direcional no caso da merge ou peer-to-peer isso lhe trará enormes problemas.

  12. Douglas disse:

    nossa ficou muito boa essas discussões e comentários, cada um pegando sua parte, valeu galera ajudou muito, sou novato em ADVPL Parabéns pelo blog

  13. Mariana D. N. disse:

    Marcelo, muito obrigada pelo post.
    Peguei um free lancer para tuning de um banco de dados do Protheus e nunca tinha mexido.
    Suas dicas foram valiosas!

    Parabéns!

  14. Jeferson Romansini disse:

    Marcel, bom dia td bem, Cara parabéns pelo post.. Queria tirar uma duvida com vc:

    Vc comentou da criação do índice e sobre as tabelas que precisam também receber o mesmo índice e tal… Algumas pessoas comentaram comigo que é preciso ter um nome padrão sequencial, acrescentar na tabela de dicionário de dados..entre outras coisas. É possível vc dar mais detalhes para que não tenha problema na criação de um índice no protheus.

    Obrigado

    • Marcel Inowe disse:

      Boa noite Jeferson.
      Até onde me lembro, se você cria um índice customizado e não o coloca no dicionário de dados do Protheus em uma futura atualização da versão esses índices serão excluídos, por isso recomendo que deixe documentado esses índices customizados e que se faça uma checagem periódica para analisar se eles ainda existem.
      É possível criar os índices no dicionário porém ao que me falavam sempre era necessário ter o campo FILIAL como sendo o primeiro campo do índice, por isso muitas vezes eu não passava para o time de desenvolvimento colocar o índice no dicionário. Não sei te informar se esse comportamento continua o mesmo.
      Forte abs!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s