Dicas sobre o banco de dados do Protheus(Totvs)

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

Olá pessoal,

Esses dias meu amigo Leandro Ribeiro (blog | twitter) solicitou no Twitter dicas sobre o banco de dados do Protheus e como eu dou manutenção no banco de dados desse produto, percebi que eu sabia vários detalhes que poderiam ser úteis para quem está começando a trabalhar com o Protheus agora.

Para quem não conhece o Protheus é um dos maiores ERPs do mundo, ele é desenvolvido pela empresa brasileira Totvs onde há alguns anos é líder de mercado nacional. A grande vantagem do Protheus é que além dele ser bem completo ele customizável, ou seja, você compra a licença do sistema e pode contratar um desenvolvedor para customizá-lo a seu gosto, já imaginou isso ? Já pensou se você pudesse fazer isso com qualquer software que comprasse ou utilizasse ? Pois é, por aí dá para sentir o poder do produto e dá para começar a perceber o porque ele é tão usado no mercado nacional, mas é claro que nem tudo são flores e é obvio que esse produto tem seus pontos fracos, algumas particularidades e é exatamente para discutir isso que escrevi esse post.

Vamos as dicas:

  1. Quase sempre o banco de dados se chama DADOSADV ou pelo menos começa com DADOS. Não me pergunte o motivo, pois eu não sei;
  2. A aplicação não acessa o banco de dados diretamente ela usa uma camada intermediária chamada Top Connect. O Top Connect 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 se conecta ao SQL Server;
  3. O Protheus é multiempresa, porém ao contrário do que estamos acostumado a ver nas modelagens onde a empresa é identificada com um campo dentro de cada tabela, o banco do Protheus cria uma tabela para cada empresa até a versão 10 do ERP, então se o teu cliente tiver mais de uma empresa aberta trabalhando no mesmo banco de dados, para cada empresa terá uma tabela de cliente, produto, nota fiscal e assim suscetivamente. Agora imaginem uma construtora do ramo imobiliário que para cada incorporação construída tem que ser aberto um CNPJ. Já pensou se ela tiver mais de 100 empreendimentos construídos ou em construção? O banco passará de 100 mil tabelas facilmente!
  4. A partir da versão 11 do Protheus já é possível criar as empresas dentro da mesma tabela o que diminui significativamente o número de tabelas dentro do banco de dados. Essa dica da versão 11 do Protheus foram dadas pelos amigos Bruno e Luiz Carlos nos comentários do post.
  5. O nome das tabelas não ultrapassam 6 caracteres e são representados da seguinte maneira: 3 primeiros caracteres é a família que aquela tabela pertence, os 2 próximos caracteres representa a empresa que aquela tabela pertence e o último caractere é reservado ao sistema, por exemplo a tabela de cliente da empresa 01 é a SA1010, da empresa 02 é a SA1020 onde SA1 é a família da tabela, 01 e 02 representa a empresa e o 0 no final é reservado. Como assim família ? Exemplo, cliente é SA1, fornecedor é SA2 e assim por diante. A Totvs considera que Cliente e Fornecedor pertencem à mesma família;
  6. O campo chave primária das tabelas é sempre o mesmo, ou seja, todas as tabelas tem um campo chamado R_E_C_N_O_ que é auto-incrementado pelo Top Connect e é a PK das tabelas;
  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 alguém excluí um registro no sistema, no banco de dados esse campo é preenchido com um *, então sempre que for fazer qualquer select lembrem-se de desprezar os registros deletados colocando na condição where D_E_L_E_T_ = ”, ou D_E_L_E_T_ <> ‘*’. Esse conceito de exclusão lógica foi herdado do DBF;
  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;
  9. Não existe campo 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 eu aconselho a criar uma rotina que diariamente verifica a existência desse índice e então caso não exista mais crie-o novamente. Eu costumo colocar tudo dentro do step de um job que diariamente consulta a sys.indexes pelo nome;
  12. Nunca crie um campo em uma tabela sem antes passar para o dicionário de dados do Protheus, pois ao abrir uma tela que use a tabela onde o campo foi criado, essa tela irá travar por não ter o campo no dicionário;
  13. O desempenho das consultas não são grande coisa, pois a maioria dos desenvolvedores Protheus não tem grandes habilidades e conhecimento sobre indexação, então é sempre bom dar uma checada nas consultas mais lentas e dar um help para a galera de desenvolvimento;
  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;
  16. Índices não usados e duplicados não é excessão e sim regra, então é válido analisar isso e repassar para os desenvolvedores. 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 elas travarão;
  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 fica geralmente em outro servidor, senão ele não voltará ao ar e a aplicação não abrirá;
  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 a.k.a Hekaton que é o novo recurso do SQL Server 2014. É possível desde que todas as Constraints Defaults sejam excluídas e os campos que são Not Null passem a ser Null, porém isso implicaria em uma grande mudança na modelagem do banco e os efeitos colaterais nesse tipo de mudança são incontáveis;
  20. Normalmente os bancos são muito grandes, então a rotina de manutenção de índices se torna uma tarefa difícil e quase impossível para a rotina do Maintenance Plan do SQL Server, portanto é válido usar rotina própria ou de terceiros como a rotina do Ola Hallengren.

Bom galera espero que essas dicas sejam úteis para todos. 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!

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 )

Imagem do Twitter

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

Foto do Facebook

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

Foto do Google+

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

Conectando a %s