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:
- Se tivermos um banco de dados muito grande (mais de 150 milhões de linhas em várias tabelas)
- 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?
sql-server
t-sql
index-tuning
sql-server-2017
Assimétrico
fonte
fonte
Respostas:
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
fonte
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 ;-)
fonte
Não.
Não é prático indexar "tudo", mas você pode indexar "a maioria".
Aqui está a coisa. Se uma tabela tiver
N
colunas, o número de índices possíveis éN!
. Digamos que uma tabela tenha 10 colunas, então você não apenas possui10
índices possíveis, mas10!
. 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.
fonte
Não, provavelmente não terá impacto negativo nas
SELECT
consultas, masINSERT
custos.WHERE
expressões de condição ainda não usam índices, principalmente os mais complexos.fonte