Eu tenho uma tabela grande (300 milhões de linhas), com cerca de 1 milhão de linhas adicionadas por dia. Estes são dados de série temporal, então eu tenho a seguinte configuração:
CREATE TABLE Readings (
Id INT PRIMARY KEY,
TrackerId INT,
DateProcessed DATETIME,
-- About 10 other columns of data
)
CREATE INDEX IX_TrackerId_DateProcessed
ON Readings (
TrackerId,
DateProcessed
) INCLUDE (
-- all the other columns
) WHERE (
TrackerId IS NOT NULL
)
Quando visualizamos os dados, geralmente executo algo como a seguinte consulta:
SELECT Latest.*
FROM Trackers
CROSS APPLY (
SELECT TOP 1 *
FROM Readings
WHERE TrackerId = Trackers.Id
ORDER BY DateProcessed DESC
) Latest
Isso costumava funcionar bem. Agora, leva uma eternidade para gerar o plano de consulta, mesmo quando eu digo explicitamente para usar o índice. A única solução que encontrei até agora é atualizar as estatísticas da tabela com o seguinte comando:
UPDATE STATISTICS Readings
Isso leva cerca de dez minutos para ser executado e, em seguida, a consulta de seleção é executada bem, mas apenas por um dia . Então eu tenho que atualizar as estatísticas novamente. Por que as estatísticas estão desatualizadas tão rapidamente e o que posso fazer para evitar isso?
Pontos que merecem destaque:
- Eu só acrescento à tabela, nunca atualizo ou excluo linhas
- Existem algumas linhas antigas com um valor nulo para o ID do rastreador, mas não serão adicionadas mais
- O banco de dados está sendo executado no nível de compatibilidade 14
- Não consigo habilitar o sinalizador de rastreamento 2371 no Azure SQL
Respostas adicionais para perguntas nos comentários
O plano de consulta estimado antes de atualizar as estatísticas
O plano de consulta estimado após a atualização das estatísticas
Os planos antes e depois de atualizar as estatísticas parecem idênticos para mim. O problema não é que estou recebendo um plano de consulta ruim, mas quanto tempo leva para obter o plano. Antes de atualizar as estatísticas, tive que esperar dois minutos pelo plano. Após atualizar as estatísticas, obteve o plano instantaneamente.
Enquanto escrevia isso, percebi que seria mais rápido esperar pela consulta e deixar o cache fazer o trabalho, em vez de atualizar as estatísticas, mas isso ainda não está resolvendo o problema. Essa consulta é executada de dentro do Entity Framework, com um tempo limite de 30 segundos, portanto, dois minutos ainda é muito tempo.