Estou encontrando um problema estranho ao acessar registros históricos em uma tabela temporal. As consultas que acessam as entradas mais antigas na tabela temporal por meio da sub-cláusula AS OF levam mais tempo do que as consultas nas entradas históricas recentes.
A tabela histórica foi gerada pelo SQL Server (inclui um índice clusterizado nas colunas de data e usa compactação de página), adicionei 50 milhões de linhas à tabela histórica e minhas consultas estavam recuperando cerca de 25.000 linhas.
Tentei determinar a causa raiz do problema, mas não consegui identificá-lo. Até agora eu testei:
- Criando uma tabela de teste com 50 milhões de linhas com um índice em cluster para ver se a desaceleração ocorreu simplesmente devido ao volume. Consegui recuperar 25K linhas em tempo constante (~ 400ms).
- Removendo a compactação de página da tabela histórica. Isso não teve efeito no tempo de recuperação, mas aumentou significativamente o tamanho da tabela.
- Tentei acessar as linhas da tabela de histórico diretamente usando uma coluna de ID versus as colunas de data. É aqui que as coisas são um pouco mais interessantes. Eu poderia acessar linhas mais antigas da tabela em ~ 400ms, onde, como na sub cláusula AS OF, levaria ~ 1200ms. Tentei filtrar na minha tabela de teste na coluna date e notei uma desaceleração semelhante quando comparada à filtragem na coluna ID. Isso me leva a acreditar que as comparações de datas estão por trás de uma certa desaceleração.
Quero olhar mais para isso, mas também quero ter certeza de que não estou latindo na árvore errada. Primeiro, alguém mais experimentou esse mesmo comportamento ao acessar dados históricos mais antigos em uma tabela temporal (notamos apenas lentidão em 10 milhões de linhas)? Segundo, quais são algumas estratégias que posso usar para isolar ainda mais a causa raiz do problema de desempenho (comecei a examinar os planos de execução, mas ainda é um pouco enigmático para mim)?
Planos de execução
Estas são consultas de recuperação simples: a primeira acessa linhas mais antigas, a segunda acessa linhas mais recentes.
Linhas mais antigas ~ tempo de execução de 1200ms
Linhas recentes ~ tempo de execução de 350ms
Detalhes da tabela
Estas são as colunas na tabela temporal. A tabela de histórico possui as mesmas colunas, mas não possui uma chave primária (conforme os requisitos da tabela de histórico):
fonte