AGUARDE... CARREGANDO...

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:

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.

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).

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:

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:

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:

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.

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

Deixe uma resposta

%d blogueiros gostam disto: