Estou tentando ajustar o desempenho de uma consulta que temos no SQL Server 2014 Enterprise.
Abri o plano de consulta real no SQL Sentry Plan Explorer e posso ver em um nó que ele tem um Predicado de Busca e também um Predicado
Qual é a diferença entre Seek Predicate e Predicate ?
Nota: Percebo que há muitos problemas com este nó (por exemplo, as linhas Estimativa vs Atual, a E / S residual), mas a questão não está relacionada a nada disso.
The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
Respostas:
Vamos lançar um milhão de linhas em uma tabela temporária, juntamente com algumas colunas:
Aqui eu tenho um índice clusterizado (por padrão) na
PK
coluna. Há um índice não clusterizadoCOL1
que possui uma coluna-chave deCOL1
e incluiCOL2
.Considere a seguinte consulta:
Aqui não estou usando
BETWEEN
porque Aaron Bertrand está por aí com essa questão.Como o SQL Server deve otimizar essa consulta? Bem, eu sei que o filtro
PK
ativado reduzirá o conjunto de resultados para cinco linhas. O servidor SQL pode usar o índice em cluster para ir para essas cinco linhas em vez de ler todos os milhões de linhas da tabela. No entanto, o índice clusterizado tem apenas a coluna PK como uma coluna-chave. Depois que a linha é lida na memória, precisamos aplicar o filtroCOL2
. Aqui,PK
é um predicado de busca eCOL2
é um predicado.O SQL Server localiza cinco linhas usando o predicado de busca e reduz ainda mais essas cinco linhas para uma linha com o predicado normal.
Se eu definir o índice clusterizado de maneira diferente:
E execute a mesma consulta, obtenho resultados diferentes:
Nesse caso, o SQL Server pode procurar usando as duas colunas na
WHERE
cláusula. Exatamente uma linha é lida da tabela usando as colunas-chave.Para mais um exemplo, considere esta consulta:
O índice IX_174860_IX é um índice de cobertura porque contém todas as colunas necessárias para a consulta. No entanto, apenas
COL1
é uma coluna chave. O SQL Server pode procurar com essa coluna encontrar as 1000 linhas com umCOL1
valor correspondente . Ele pode filtrar ainda mais essas linhas naCOL2
coluna para reduzir o resultado final definido para 0 linhas.fonte