Eu tenho uma grande tabela particionada (mais de 300 milhões de linhas, 70 partições ativas). A tabela tem PK agrupado de (K0, K1) e é particionada na coluna K1. E K1 tem seletividade muito baixa.
No entanto, a consulta a seguir leva meio minuto e a contagem de varredura é 170 e a leitura lógica é 603K.
select max(K1) from table
No entanto, a consulta semelhante na tabela não particionada com índice em K1 não leva tempo e a contagem de varredura é 1 e a leitura lógica é 5.
Um índice não particionado deve ser criado em K1?
Editar:
planeje o texto para a tabela particionada sem índice no K1. Com PK clusterizado em K0,K1, antes de criar um índice em C1.
|--Stream Aggregate(DEFINE:([Expr1004]=MAX([partialagg1005]))) |--Paralelismo(Gather Streams) |--Stream Aggregate(DEFINE:([partialagg1005]=MAX([DB1].[dbo].[table1].[K1]))) |--Clustered Index Scan(OBJECT:([DB1].[dbo].[table1].[PK_dbo_tabl1]))
Planeje o texto para tabela não particionada com índice em K1.
|--Stream Aggregate(DEFINE:([Expr1003]=MAX([DB1].[dbo].[table2].[K1]))) |--Início(EXPRESSÃO SUPERIOR:((1))) |--Index Scan(OBJECT:([Db1].[dbo].[table2].[idx_K1]), ORDERED BACKWARD)
Planeje o texto para a tabela particionada com PK clusterizado em K0, K1 e índice em C1.
|--Stream Aggregate(DEFINE:([Expr1004]=MAX([partialagg1005]))) |--Paralelismo(Gather Streams) |--Stream Aggregate(DEFINE:([partialagg1005]=MAX([db1].[dbo].[table1].[K1]))) |--Index Scan(OBJECT:([db1].[dbo].[table1].[IX_C1]))
Acho que entendi mal / li mal a pergunta inicialmente.
Para satisfazer a consulta MAX(k1), neste caso, é necessária uma varredura de índice clusterizado de cada uma das 70 partições.
Com um índice definido em K1, uma varredura ORDERED BACKWARD do índice é escolhida, o que provavelmente se traduz em 4 páginas lidas das páginas de índice não folha mais 1 para o nível folha.
A ordem de suas chaves de índice é o problema. Você pode criar um índice alinhado à partição
K1
para resolver isso facilmente.No momento, seu índice
K0, K1
não pode ser usado diretamente para encontrar o valor máximo rapidamente, poisK1
é a segunda chave.