Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Aviso

Este documento está

...

em fase de elaboração, sendo que as informações ainda estão sendo revisadas.

Não o utilize como referência até o momento de sua publicação.

Informações

No banco de dados do Protheus, as seguintes opções devem estar habilitadas: 

  • Auto Create Statistics = TRUE
  • Auto Update Statistics = TRUE

A atualização de estatísticas é uma das manutenções que deve ser feita no banco de dados. Para tal, realizamos diversos testes de estresse para identificar pontos que possam ser ofensores na performance do Protheus.

Para os testes, utilizamos o banco de dados SQL Server 2019 com uma ferramenta para testes de estresse desenvolvida pela Engenharia de Dados Protheus. Também utilizamos o dicionário padrão do Protheus 12.1.27, com dicionário no banco de dados. Os quatro processos utilizados no teste foram:

  • Pedido de venda

...

  • ;
  • Documentos de entrada

...

  • ;
  • Movimentações internas;
  • Produtos.

As tabelas preenchidas foram: SA1 (Clientes), SA2 (Fornecedores), SB1 (Produtos), SF1 (Documentos de entrada), SF2 (Documentos de saída), SD3 (Movimentos internos) e a SE1 (Títulos a receber).

Informações
titleInformações - Performance da aplicação

A boa manutenção do banco de dados impacta diretamente na performance do produto Protheus, principalmente em cenários com dicionário no banco de dados. O tempo de resposta da aplicação também é relacionado com o banco de dados: se o banco de dados responde mais rápido, a aplicação pode responder mais rápido. Isto não significa que outros fatores não impactem a performance do produto, apenas que a saúde do banco de dados é um dos fatores que têm esse impacto. 

...

Quando realizamos uma query no banco de dados, o SGBD procura trazer os dados da forma mais rápida possível. O SQL Server Query Optmizer realiza uma análise, verifica se existe um plano e se o mesmo precisa ser atualizado. Se não houver, ele criará um novo plano de acordo com a query. Podemos chamar o plano de consulta de caminho mais rápido para chegar à informação desejada, e para isso ele utiliza dois fatores principais. 

...

Realizamos uma consulta de exemplo em uma base de testes, na tabela SD3990, que possuía 1 milhão de registros.

...

Nota
titleAtenção

Não utilize consultas com * em bases de produção ou em fontes customizados, pois isto impacta a performance da aplicação.

Este é apenas um exemplo executado em uma base de testes. 

Essa query demorou 1489 ms. Analisando o plano de execução, o SQL Server nos indica a criação de um índice:

...

Porém, a criação do índice não irá resolver a situação. Esta criação até pode melhorar a situação da query naquele momento, mas criar um índice é indicado somente em último caso, se a query for utilizada de forma recorrente e não houver a possibilidade de usar um índice já existente na tabela.

...

No exemplo acima, o próprio SQL Server dá um alerta no Clustered Index Scan:

...

Ao analisar o alerta, temos o seguinte:

Neste Warning, o SQL Server indica a falta de estatística no campo D3_DOC

Habilitamos o parâmetro Auto Create Statistics na base de dados analisada. Este parâmetro pode ser habilitado nas propriedades do banco de dados, na aba Options. O alteramos de FALSE para TRUE:

...

Após alterar o parâmetro, executamos novamente a query. É possível ver a alteração no plano de execução do SQL Server: agora, ele começa a utilizar índices já existentes no banco de dados, sem solicitar a criação de um novo índice:

...

Nota
titlePercentual de redução no tempo da consulta

O percentual apresentado neste documento é referente às condições específicas do teste, com fatores que englobam a versão do banco de dados, a quantidade de registros na base de dados, os índices já existentes. Este valor não é fixo, e pode variar de acordo com as configurações de seu ambiente. 

Com o seguinte DBCC, é possível verificar a criação de uma nova estatística logo após executarmos a query de exemplo. Ela foi criada pelo SQL Server automaticamente, e demorou alguns milissegundos para ser criada.

...

No início deste documento, pontuamos foram pontuados dois fatores que impactam diretamente a criação do plano de execução, que são a cardinalidade e os operadores. 

Sendo assim, aumentamos aumentou-se a cardinalidade, incluindo mais de 20 milhões de registros nesta tabela, e verificamos verificou-se a performance da query nos testes já apresentados. 

...

  • Mesmo comportamento do Trial 1. Tempo de 48 segundos.

Comprovamos Comprovou-se  então que, quanto maior a quantidade de dados, maior será o impacto quando não temos houver as estatísticas habilitadas.

Com mais de 20 milhões de registros, quando estamos sem não houver estatística saímos sai de 1,4 seg para 48 seg.

E quando utilizamos utilizou-se a estatística, saiu de 0,2 ms para 1,4 segundos que ainda pode ser melhorado com Rebuild de Index, mas esse tema fica para outro estudo.

Realizei Realizaram-se os mesmos procedimentos de do teste acima, agora iniciando com 25 milhões de linhas e a partir do Trial 8 - Auto Update Statistics, nos testes  tivemos testes apareceram os seguintes resultados:

Trial 1: Banco de dados com Auto Create Statistics False. 

...

Trial 9:  Banco de dados com Auto Create Statistics True e Auto Update Statistics True. Inclusão de 10 linhas.  

  • O SQL Server atualiza a estatística. Tempo de 1,8 segundos.

Nestes últimos testes, incluímos incluiu-se o Auto update statistics a partir do Trial 8, e na próxima vez que houver uma alteração, o SQL irá verificar que a estatística está desatualizada e atualizar a mesma. Sendo assim, incluímos incluiu-se apenas 10 registros e a estatística foi atualizada automaticamente conforme esperado. 

O SQL Server tem um cálculo específico sobre a quantidade de registros para realizar a atualização da estatística.

É possível habilitar o sinalizador de rastreamento 2371, que altera o limite fixo de estatísticas de atualização para o limite de estatísticas de atualização linear, ou seja, para que o SQL Server utilize um limite de atualização de estatísticas dinâmico e decrescente, principalmente em versões anteriores ao que foi utilizado no teste. Esta opção deve ser analisada com acompanhamento de um DBA para verificar a melhor configuração para seu cenário.

...