Se um banco de dados tiver apenas uma inserção, é ruim indexar todas as combinações de colunas possíveis?


23

Estou trabalhando em um sistema de relatórios que exigirá grandes consultas selecionadas, mas é baseado em um banco de dados preenchido apenas uma vez. O sistema de gerenciamento de banco de dados é o Microsoft SQL Server 2017. Provavelmente, existe uma maneira melhor de projetar um sistema como esse, mas vamos abordar isso teoricamente.

Teoricamente falando:

  1. Se tivermos um banco de dados muito grande (mais de 150 milhões de linhas em várias tabelas)
  2. E podemos assumir que o banco de dados será preenchido apenas uma vez.

A indexação de todas as combinações de colunas possíveis pode ter um impacto negativo no desempenho de uma consulta selecionada?


4
Toda combinação possível é impraticável na maioria das vezes. Uma abordagem mais sensata é indexar manualmente, mas com muita generosidade. Definitivamente, isso pode fazer sentido.
usr

12
Sugiro reformular seu título ou seu texto em negrito para que sejam consistentes. Num relance Fiquei confuso com a maior resposta votaram "Sim"
aaaaaa

Linhas de 150 milhões são grandes para uma única tabela, mas não são grandes para um banco de dados. Na prática, os sistemas de relatórios usam apenas um pequeno subconjunto de combinações de colunas possíveis, é melhor focar nas combinações de teclas pelo menos inicialmente e depois ficar mais complexo apenas quando necessário.
Pojo-guy

Respostas:


36

Sim, isso influenciará o tempo de compilação do plano inicial, pois o otimizador terá muitos caminhos de acesso extras aos dados a serem considerados.

Como você está no SQL Server 2017, carregando uma vez e executando relatórios, por que não usar um índice de armazenamento de colunas em cluster?

Essa parece ser a solução ideal para sua necessidade de indexar todas as combinações de colunas possíveis.

Índices Columnstore - Visão Geral


O columnstore também é para onde eu deveria ir, mas estou me perguntando ... o otimizador não está funcionando exatamente ao contrário do que você descreveu? Quero dizer, em vez de varrer os índices disponíveis e "imaginar" quais deles poderiam ser úteis, isso não exclui a consulta e "pensa em" um índice perfeito para essa consulta, depois verifica se existe? (Se não aparecer, uma mensagem de índice ausente será gerada.) Se eu estiver certo (não sei, apenas supondo), mesmo que existam milhares de índices, não deverá ser visivelmente mais longo do que ter apenas vários deles.
Limonka

26

Se você tiver N colunas em uma tabela, todas as combinações possíveis de colunas serão 2 ^ N-1 (removendo o conjunto vazio). Para 10 colunas, o que significaria 1023 índices, para 20 colunas, terminamos com 1048575 índices. A maioria dos índices nunca será usada, mas precisará ser levada em consideração pelo otimizador. É possível que o otimizador escolha um índice abaixo do ideal em vez de um índice melhor. Eu não seguiria o caminho de gerar todos os tipos de índices, em vez de tentar descobrir quais índices seriam realmente benéficos.

EDIT corrigiu o número de índices possíveis

Como Jeff aponta, é ainda pior que 2 ^ N (conjunto de potência), pois (3,2,1) é claramente diferente de (1,2,3). Para N colunas, podemos escolher a primeira posição em um índice que contém todas as colunas de N maneiras. Para a segunda posição do N-1, etc. Acabamos, portanto, com o N! índices diferentes de tamanho completo. Nenhum desses índices é incluído em outro índice neste conjunto. Além disso, não podemos adicionar outro índice mais curto para que ele não seja coberto por nenhum índice completo. O número de índices é, portanto, N !. O exemplo para 10 colunas, portanto, se torna 10! = 3628800 e para 20 (drumroll) 2432902008176640000 índices. Esse é um número ridiculamente grande: se colocarmos um ponto para cada índice de um mm por peça, o raio de luz levará 94 dias para passar todos os pontos. Tudo e todos, não ;-)


6
Pior ainda: a ordem das colunas no índice pode ser importante. Portanto, você recebe um máximo de N! índices.
Jeff

2
Mas você não precisa de índices que sejam prefixos de outros índices.
Barmar

3
É ainda pior. Existem combinações ASC e DESC para cada índice.
ypercubeᵀᴹ

2
E muito pior, existem índices INCLUDE.
ypercubeᵀᴹ

2
E um grande número de índices parciais.
ypercubeᵀᴹ

7

Não.

Não é prático indexar "tudo", mas você pode indexar "a maioria".

Aqui está a coisa. Se uma tabela tiver Ncolunas, o número de índices possíveis é N!. Digamos que uma tabela tenha 10 colunas, então você não apenas possui 10índices possíveis, mas 10!. Isso é ... 3.628.800 ... em uma única mesa. É muito espaço em disco, E / S, cache e tempos de busca.

Por quê? Alguns motivos:

  • Os índices LightWight geralmente são armazenados em cache, algo que os torna mais rápidos. Se você tiver 3 milhões deles, eles NÃO serão armazenados em cache.

  • O otimizador de SQL pode levar muito tempo para decidir qual é o melhor a ser usado, especialmente ao usar junções.

  • O otimizador de SQL pode desistir de usar o algoritmo abrangente e tentar um algoritmo heurístico. Isso pode ser "abaixo do ideal". O PostgreSQL, por exemplo, possui opções diferentes para "consultas com menos de 8 tabelas" e "consultas com mais de 8 tabelas".

  • Os índices devem ser mais leves que o monte. Se você estiver indexando tudo, o índice se tornará tão pesado quanto a pilha ... algo que derrota o objetivo do índice.


O número não é 2 ^ 10? Cada coluna é incluída ou excluída de um determinado índice. O pedido importa?
RemcoGerlich

2
@RemcoGerlich sim, a ordem é importante.
ypercubeᵀᴹ

2

Não, provavelmente não terá impacto negativo nas SELECTconsultas, mas

  • Isso causará um alto uso do disco.
  • Isso aumentará enormemente os INSERTcustos.
  • A maioria dos seus índices nunca será usada.
  • Muitas WHEREexpressões de condição ainda não usam índices, principalmente os mais complexos.
  • A contagem dos índices necessários aumentará exponencialmente com a contagem das colunas. Ou seja, se você tiver, por exemplo, 8 colunas, precisará de 256 índices para todas as combinações possíveis.

Pode causar um problema totalmente durante o tempo de compilação.
Erik Darling

@sp_BlitzErik Você acha que o ORM no aplicativo?
peterh diz restabelecer Monica

Não, veja minha resposta.
Erik Darling

@sp_BlitzErik Uau, que bom ver!
peterh diz restabelecer Monica
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.