Estou tentando entender como a amostragem de estatísticas funciona e se o comportamento abaixo é esperado ou não nas atualizações de estatísticas de amostra.
Temos uma grande tabela particionada por data com alguns bilhões de linhas. A data de partição é a data comercial anterior e, portanto, é uma chave crescente. Carregamos apenas dados nesta tabela para o dia anterior.
O carregamento de dados é executado durante a noite, portanto, na sexta-feira, 8 de abril, carregamos dados para o dia 7.
Após cada execução, atualizamos as estatísticas, embora façamos uma amostra, em vez de um arquivo FULLSCAN
.
Talvez eu esteja sendo ingênuo, mas esperava que o SQL Server identificasse a chave mais alta e a chave mais baixa no intervalo para garantir que obtivesse uma amostra de intervalo precisa. De acordo com este artigo :
Para o primeiro balde, o limite inferior é o menor valor da coluna na qual o histograma é gerado.
No entanto, ele não menciona o último intervalo/maior valor.
Com a atualização das Estatísticas amostradas na manhã do dia 8, a amostra perdeu o valor mais alto da tabela (dia 7).
Como fazemos muitas consultas nos dados do dia anterior, isso resultou em uma estimativa de cardinalidade imprecisa e em várias consultas com tempo limite esgotado.
O SQL Server não deve identificar o valor mais alto para essa chave e usá-lo como o máximo RANGE_HI_KEY
? Ou este é apenas um dos limites de atualização sem uso FULLSCAN
?
Versão SQL Server 2012 SP2-CU7. No momento, não podemos atualizar devido a uma mudança de OPENQUERY
comportamento no SP3 que estava arredondando para baixo os números em uma consulta de servidor vinculada entre o SQL Server e o Oracle.
É uma limitação da implementação atual de estatísticas amostradas. Tal como está, a coleta de estatísticas amostradas usa
TABLESAMPLE SYSTEM
, que usa uma varredura de ordem de alocação e escolhe as páginas da varredura para amostra. Apenas as páginas escolhidas contribuem para o histograma.Como a varredura é ordenada por alocação (em vez de ordenada por índice), não há como dar preferência à primeira e à última página na ordem de chave.
Para obter mais informações, consulte esta pergunta relacionada:
Como funciona a amostragem ao atualizar as estatísticas?
e meu artigo, Allocation Order Scans
Para soluções alternativas, consulte Estatísticas sobre colunas ascendentes por Fabiano Amorim
Suposição rápida: habilite o sinalizador de rastreamento 4139.
Você já está executando o SP2-CU1, então isso deve funcionar
Observe também as diretrizes sobre TF 2389 ad 2390 e consulte também http://sql-sasquatch.blogspot.com.mt/2013/06/mssql-plan-guides-to-address-ascending.html
(Nota, eu realmente não atingi esse problema e não mergulhei tão fundo)