Como a amostragem funciona ao atualizar as estatísticas?

10

Eu tenho várias mesas enormes. Gostaria de garantir que suas estatísticas estejam atualizadas por meio de um plano de manutenção semanal.

No entanto, isso leva muito tempo.

Se eu especificar

WITH SAMPLE 50 PERCENT

o SQL Server então mostra:

  1. os primeiros 50% das páginas
  2. qualquer outra página
  3. ou alguma outra estratégia?

BOL não está claro sobre isso.

Nik
fonte

Respostas:

16

Pois WITH SAMPLE 50 PERCENTfunciona como se para cada página de dados da tabela o SQL Server viras uma moeda. Se ele cair, então ele lerá todas as linhas da página. Se ele pousar caudas, então não lerá nenhum.

O rastreamento da UPDATE STATISTICS T WITH SAMPLE 50 PERCENTchamada no Profiler mostra que a seguinte consulta foi emitida

SELECT StatMan([SC0], [SB0000])
FROM   (SELECT TOP 100 PERCENT [SC0],
                               step_direction([SC0]) OVER (ORDER BY NULL) AS [SB0000]
        FROM   (SELECT [C] AS [SC0]
                FROM   [dbo].[T] TABLESAMPLE SYSTEM (5.000000e+001 PERCENT) 
                WITH (READUNCOMMITTED)) AS _MS_UPDSTATS_TBL_HELPER
        ORDER  BY [SC0],
                  [SB0000]) AS _MS_UPDSTATS_TBL
OPTION (MAXDOP 1) 

Com plano

insira a descrição da imagem aqui

TABLESAMPLE SYSTEM (5.000000e+001 PERCENT)é responsável pela amostragem e está documentado aqui

TABLESAMPLE SYSTEMretorna uma porcentagem aproximada de linhas e gera um valor aleatório para cada página física de 8 KB na tabela. Com base no valor aleatório de uma página e na porcentagem especificada na consulta, uma página é incluída na amostra ou excluída. Cada página incluída retorna todas as linhas no conjunto de resultados de amostra.

A documentação também declara

Embora o plano mostre que uma varredura de tabela é executada, apenas as páginas incluídas no conjunto de resultados precisam ser lidas do arquivo de dados.

A STATMANchamada é para uma função agregada interna descrita brevemente aqui

Martin Smith
fonte