Árvore de páginas

Versões comparadas

Chave

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

...

O primeiro fator é a cardinalidade que, em resumo, significa a quantidade de linhas que serão acessadas pela query. O segundo fator são os operadores usados na query que mudam, e muito, o plano de execução.

Testes realizados

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

Bloco de código
languagesql
SELECT SD3.* FROM SD3990 SD3 
where SD3.D3_DOC >= '000648000' AND SD3.D3_DOC <= '000648050';
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 1503 ms. Analisando o plano de execução, o SQL Server nos indica a criação de um índice:


Image Added

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 outra possibilidade de melhorá-la.


Nota
titleAtenção: Criação de índices

Criar muitos índices no banco de dados pode gerar lentidão nas rotinas de Insert, Update e Delete.

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

Image Added

Ao analisar o alerta, temos o seguinte:

Image Added

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:

Image Added

Ou por linha de comando:

Bloco de código
languagesql
USE [master] 
go 

ALTER DATABASE [statistic_teste3] 
SET auto_create_statistics ON 
go
Nota
OBS: altere o “statistic_teste3” para o nome do seu banco de dados.

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:

Image Added

Ao comparar o tempo da execução após habilitar este parâmetro, verificamos a redução do tempo de 1489 ms para 274 ms, uma redução de aproximadamente 81,6% no tempo da execução.



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.



Bloco de código
languagesql
DBCC SHOW_STATISTICS (SD3990, D3_DOC)


Estatística criada:


Image AddedExemplo: