Histórico da Página
...
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 | ||
---|---|---|
| ||
SELECT SD3.* FROM SD3990 SD3
where SD3.D3_DOC >= '000648000' AND SD3.D3_DOC <= '000648050'; |
Nota | ||
---|---|---|
| ||
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:
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 | ||
---|---|---|
| ||
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:
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:
Ou por linha de comando:
Bloco de código | ||
---|---|---|
| ||
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:
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 | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
DBCC SHOW_STATISTICS (SD3990, D3_DOC) |
Estatística criada:
Exemplo: