Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como o SQL Server calcula o número estimado de linhas?


SQL Server divide cada índice em até 200 intervalos com os seguintes dados (de aqui ):

Normalmente, os valores mais preenchidos vão para RANGE_HI_KEY .

No entanto, eles podem entrar no intervalo e isso pode levar à distorção na distribuição.

Imagine esses dados (entre outros):

Valor-chave Contagem de linhas
1          1
2          1
3          10000
4          1

SQL Server geralmente cria dois intervalos:1 para 3 e 4 para o próximo valor preenchido, o que torna estas estatísticas:
RANGE_HI_KEY  RANGE_ROWS  EQ_ROWS  AVG_RANGE_ROWS  DISTINCT_RANGE_ROWS
3             2           10000    1               2

, o que significa ao pesquisar, digamos, 2 , existe apenas 1 linha e é melhor usar o acesso ao índice.

Mas se 3 vai dentro do intervalo, as estatísticas são estas:
RANGE_HI_KEY  RANGE_ROWS  EQ_ROWS  AVG_RANGE_ROWS  DISTINCT_RANGE_ROWS
4             10002       1        3334            3

O otimizador acha que existem 3334 linhas para a chave 2 e o acesso ao índice é muito caro.