TL;DR: É possível descobrir quais partições foram reamostradas e quais não foram quando estatísticas incrementais são usadas? A plataforma é a edição SQL Server 2014 Enterprise.
A versão longa com algumas informações básicas é assim.
Assumindo um ambiente DW bastante típico, há uma tabela particionada. O particionamento é baseado em uma coluna de data. Isso é feito quando os dados de preparação são carregados em uma tabela separada e, após o pré-processamento, a alternância de partição é usada para mover os dados para a tabela de fatos de produção. Ah, e um índice columnstore clusterizado está em uso. Existem cerca de mil partições usadas. O banco de dados está sendo executado em uma máquina virtual.
Existem cerca de 7,5 gigarows (100 GB) na tabela de fatos. O crescimento diário é de cerca de cinco megarows. Esta é uma taxa de crescimento muito pequena para acionar a atualização automática de estatísticas, salve o sinalizador de rastreamento 2371 (que não foi tentado).
A reação instintiva do desenvolvedor às estatísticas desatualizadas foi atualizá-las. Para 7,5 gigarows, a atualização completa de todas as estatísticas leva cerca de cinco horas. Para uma única atualização de estatísticas, o desempenho do processamento é de cerca de 20 minutos ou 90 megarows por segundo.
Como o sistema está em uma plataforma VM, as regras de negócio limitam seus custos. Nem a memória nem o IOPS são facilmente aumentados. O trabalho de atualização de cinco horas é muito lento para ser incluído no processo ETL noturno; portanto, as estatísticas permanecem desatualizadas, são atualizadas em um horário inesperado ou serão atualizadas em uma janela de manutenção.
Como o SQL Server é a versão Enterprise Edition 2014, ele oferece suporte a estatísticas incrementais que soam exatamente como a solução. Depois de converter as estatísticas em incrementais, o processamento de uma única estatística para partição única leva apenas 20 segundos. O total geral da partição recém-comutada é de cerca de cinco minutos. Isso parece ótimo e certamente se encaixa no processo ETL.
O que me pergunto é como gerenciar estatísticas incrementais no ambiente de partição comutada. Supondo que as estatísticas sejam convertidas e atualizadas como incrementais na data D, como descobrir as partições não processadas, digamos, na data D+2? A atualização de estatísticas no processo ETL é trivial, pois o processo de troca obviamente está ciente do ID da partição. Mas se houver partições que não foram reamostradas, como encontrá-las?
- A última atualização das estatísticas pode ser encontrada em
sys.dm_db_stats_properties
- Os números de partição estão disponíveis em
sys.partitions
- Os valores da função de particionamento estão em
sys.partition_range_values
Pode-se escolher a data da última atualização L para uma estatística e compará-la com a data de hoje T. Em seguida, calcule qual partição id L aponta e se é igual à de T. Em seguida, prossiga com a atualização de todos os IDs de partição [L, T). Isso parece complicado e sujeito a erros, então existe uma maneira melhor? Um DMV que mostre quais partições são usadas para reamostragem seria bom, mas não existe, existe?
Minha primeira pergunta seria perguntar por que você está realmente usando incremental em primeiro lugar. Aqui está uma resposta que postei sobre estatísticas incrementais, uma postagem de blog de Erin Stellato que ilumina uma das principais reclamações e armadilhas com estatísticas incrementais (elas não são usadas no nível de partição pelo otimizador) e duas postagens de blog minhas que trabalhe avaliando qualquer caso de uso potencial para estatísticas incrementais.
Dito isto, para saber quando as estatísticas de uma partição foram amostradas, você pode usar um DMF não documentado (
sys.dm_db_stats_properties_internal()
) para obter informações no nível da partição. Tenho um comentário nesta postagem do blog que descreve como entender a hierarquia em um nível razoavelmente alto.