Existe uma vantagem em não particionar o alinhamento de um índice?

9

Tenho o privilégio de gerenciar uma grande tabela OLAP particionada. Ao revisar esta tabela, notei que um dos índices não está alinhado com o esquema de particionamento. Como o autor não está disponível e as pesquisas no Google cuidadosamente elaboradas não retornaram nenhum resultado útil, não tenho certeza se isso foi intencional ou acidental.

Existe algum motivo para não particionar o alinhamento de um índice no SQL Server 2008?

Robin
fonte
11
Possivelmente. Consulte o uso de estatísticas do índice para ver se esse índice está sendo usado. Nesse caso, use eventos estendidos ou um rastreamento do lado do servidor para capturar quais consultas estão atingindo esse índice. Se eles tivessem um desempenho melhor em um índice alinhado por partição, ótimo. Caso contrário, verifique se eles realmente precisam de índices particionados não alinhados. Se não o fizerem, eu diria que a partição esteja alinhada de qualquer maneira, pois consultas futuras poderão tirar vantagem disso. Obviamente, se o custo / esforço / interrupção for muito alto, não o será.
Ali Razeghi
Pelo que li, a melhor prática para indexar uma tabela particionada é alinhar o índice com o esquema de particionamento. Essa tabela em particular me fez pensar que eu quero entender um caso de uso para não alinhar um índice com o esquema de partição. Não estou tentando resolver um problema específico, portanto não tenho uma consulta que precise ser analisada.
Robin
Outro motivo para criar um índice não alinhado é um índice exclusivo (incluindo chave primária ou restrição exclusiva) que não inclui a coluna de particionamento. Nesse caso, o índice não deve ser particionado ou particionado usando uma função / esquema diferente.
Dan Guzman

Respostas:

11

A principal vantagem de não particionamento de um índice (não exclusiva) sobre um objecto de base particionado é que ele funciona em torno de uma limitação consulta optimizador de longa data relacionadas com pedidos de dados ordenados, tais como MIN, MAX, ou TOP (n)consultas.

Em um índice particionado, o otimizador geralmente não pode converter MIN, MAXou TOP (n)na mesma operação por partição , seguido por um agregado global final sobre os agregados parciais por partição. O otimizador escolhe um plano de execução que varre todas as partições do índice. A exceção é o caso único em que a operação agregada ou superior é especificada na coluna de particionamento.

Devo mencionar que também existem boas razões para não ter índices não alinhados. Optar por usar um índice não alinhado teria que ser uma escolha muito informada. Eu já fiz isso sozinho (raramente) no passado, mas em circunstâncias muito específicas em que os benefícios superavam claramente os custos, ou não havia outra alternativa razoável.


Artigo de Itzik Ben-Gan explicando a questão.

Paul White 9
fonte
3

Existe o problema óbvio em torno de algumas restrições (por exemplo, exclusivas) que exigem um índice não alinhado.

Além disso, os índices não alinhados têm um grande custo (principalmente impedem que muitos operadores paralelos entrem em thread por partição e as alternativas custam muito memória) e, portanto, eu recomendaria fortemente esses índices. Mesmo com os casos listados por Paul, eu ainda desaconselharia índices não alinhados.

Remus Rusanu
fonte
11
Sim. A escolha de um índice não alinhado teria que ser uma escolha muito informada. Eu já fiz isso sozinho (raramente) no passado, mas em circunstâncias muito específicas em que os benefícios superavam os custos.
Paul White 9
2

Os índices não alinhados negam o principal benefício do particionamento, que é a troca de partições. Se você não depende disso e está particionando por outros motivos (armazenamento diferente, partições somente leitura, estatísticas incrementais, ...), vá em frente e crie um indexex não alinhado.

Índices não alinhados são úteis porque você pode impor restrições exclusivas a toda a tabela. Além disso, índices não alinhados não exigem que a chave de particionamento seja um prefixo de busca implícito. Imagine ter 10000 partições e consultas não baseadas na chave de particionamento. O plano de execução precisará buscar 10000 partições se o índice estiver alinhado. As outras respostas têm mais exemplos.

usr
fonte