Loading…

Melhorando a Performance de Consultas no Totvs Protheus – Parte 3

Fala pessoal,

Antes de lerem esse post, caso ainda não tenham lido os anteriores, sugiro que façam para seguirem a linha de raciocínio:

Pegando mais uma quey no Traces de queries demoradas. Durante a semana, essa query apareceu várias vezes demorando mais de 3 segundos. Contudo, no fim de semana, ao rodar ela sem concorrência, ela está instantânea.

Nesse caso eu faço o que Fabricio? Ignoro?

Não. Vi que tem índices triviais nessa query que não existem, então vamos criar para reduzir a quantidade de leituras dela:

SELECT   C6_NUM ,
         C6_QTDVEN ,
         C6_NOTA ,
         C6_CLI ,
         C6_PRCVEN ,
         C5_EMISSAO ,
         C5_YSTATUS ,
         C5_VEND1
FROM     SC6080 SC6 ,
         SC5080 SC5
WHERE    C6_FILIAL = C5_FILIAL
         AND C5_NUM = C6_NUM
         AND C6_PRODUTO = 'BHASJHSU654556'
         AND C6_FILIAL = '01'
         AND SC6.D_E_L_E_T_ = ''
         AND SC5.D_E_L_E_T_ = ''
ORDER BY C5_EMISSAO ,
         C6_NUM;

Segue o plano dessa query:

O SQL Server está fazendo Seek+lookup nas duas tabelas envolvidas (SC5080 e SC6080).

Levando em conta a Parte 1 e Parte 2 da série Fabrício, devemos tentar criar um índice apenas em C6_PRODUTO para ver se já resolve a query?

Veja bem….

Vamos criar para verem o que vai acontecer.

create nonclustered index SC6080W01 on SC6080(C6_PRODUTO)with(FILLFACTOR=90,DATA_COMPRESSION=PAGE)

Ao criar o índice, o SQL Server não usou o índice e a query rodou com o mesmo plano de execução anterior.

Oxente Fabrício… venha cá… mas por que não usou?

obs.: Estou atendendo um cliente em Salvador hoje (08/01) e peguei o sotaque.

R: Porque essa query retorna mais de 2 mil linhas no resultado.

Gravem isso que é muito importante: Fazer um lookup em poucas linhas é tranquilo, agora fazer um lookup em muitas linhas é custoso e esse é o motivo do SQL não querer usar o nosso índice por essa coluna única.

Como essa tabela não é tão grande e esse índice em produto tem tudo para ser bom por ser uma coluna bem seletiva, vamos criar um covered index (índice com todas as colunas necessárias para executar essa query).

create nonclustered index SC6080W01 on SC6080
(C6_PRODUTO,C6_NUM,C6_FILIAL,D_E_L_E_T_ ) include(C6_NOTA,C6_CLI,C6_QTDVEN,C6_PRCVEN)
with(FILLFACTOR=90,DATA_COMPRESSION=PAGE)

A quantidade de leituras na tabela SC6080 já reduziu para 15 reads e a query ficou com esse plano:

 

Olhando os índices da tabela SC5080, já existe um índice na coluna C5_NUM criado por mim para alguma outra query nesse cliente, contudo esse índice só possui 4 colunas:

C5_NUM, C5_FILIAL, C5_TIPO, D_E_L_E_T_

Como esse índice não tem todas as colunas que a query precisa, o SQL não está usando.

Vamos adicionar todas as colunas da tabela SC5 utilizada pela query para ver se agora o SQL vai usar meu índice:

create nonclustered index SC5080W01 on SC5080
(C5_NUM, C5_FILIAL, C5_TIPO, D_E_L_E_T_,C5_EMISSAO) include(C5_YSTATUS,C5_VEND1)
with(FILLFACTOR=90,DATA_COMPRESSION=PAGE)

Agora sim o SQL passou a usar os meus 2 índices para essa query:

 

Segue a diferença de leituras com a criação dos índices:

-- Antes dos índices
Table 'SC5080'. Scan count 2319, logical reads 14538
Table 'SC6080'. Scan count 1, logical reads 7121

--Depois dos índices
Table 'SC5080'. Scan count 2319, logical reads 7423
Table 'SC6080'. Scan count 1, logical reads 15

Tabela SC5080 rediziu 7 mil reads e a tabela SC6080 reduziu mais 7 mil reads.

Não foi um ganho tão grande quanto nos 2 casos anteriores, mas como são índices bons (PRODUTO e NUM), certamente esses índices devem ser utilizados para outras queries.

Lembrem disso: Um índice por uma coluna boa, não vai ser utilizado só pela query que você está analisando, certamente será utilizado por outras queries do sistema.

É isso ai pessoal, melhoramos mais uma query no Protheus.

Até a próxima análise.

 

Atualizado no dia 07/10/2020:

Publiquei um curso com 11 horas de duração com toda minha experiência de anos no assunto e de dezenas de clientes Protheus atendidos:

Curso: Melhorando a Performance de Consultas no Totvs Protheus

Gravei uma aula grátis com 60 minutos de duração sobre o que você deve aprender para melhorar a performance no Protheus:

Gostou desse Post?

Curta, comente, compartilhe com os coleguinhas…

Assine meu canal no Youtube e curta minha Página no Facebook para receber Dicas de Leituras e Eventos sobre SQL Server.

Até a próxima.

Abraços,

Fabrício Lima

Microsoft Data Platform MVP

Consultor e Instrutor SQL Server

Trabalha com SQL Server desde 2006

2 thoughts on “Melhorando a Performance de Consultas no Totvs Protheus – Parte 3

Deixe uma resposta

%d blogueiros gostam disto: