AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 209583
Accepted
Lopsided
Lopsided
Asked: 2018-06-14 09:31:09 +0800 CST2018-06-14 09:31:09 +0800 CST 2018-06-14 09:31:09 +0800 CST

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

  • 772

Estou trabalhando em um sistema de relatórios que exigirá grandes consultas de seleção, mas é baseado em um banco de dados que é preenchido apenas uma vez. O sistema de gerenciamento de banco de dados é o Microsoft SQL Server 2017. Provavelmente há 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?

sql-server t-sql
  • 4 4 respostas
  • 5103 Views

4 respostas

  • Voted
  1. Best Answer
    Erik Darling
    2018-06-14T09:47:02+08:002018-06-14T09:47:02+08:00

    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 apenas 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

    • 37
  2. Lennart - Slava Ukraini
    2018-06-14T09:55:55+08:002018-06-14T09:55:55+08:00

    Se você tiver N colunas em uma tabela, todas as combinações de colunas possíveis são 2^N-1 (removendo o conjunto vazio). Para 10 colunas, isso significaria 1023 índices, para 20 colunas, acabamos com 1048575 índices. A maioria dos índices nunca será usada, mas terá que ser levada em consideração pelo otimizador. É possível que o otimizador escolha um índice abaixo do ideal em vez de um 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.

    EDITAR número corrigido de índices possíveis

    Como Jeff aponta, é ainda pior do que 2^N (power-set) já que (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 em N-1 maneiras, etc. Nós, portanto, terminamos com N! diferentes índices de tamanho completo. Nenhum desses índices é incluído por outro índice neste conjunto. Além disso, não podemos adicionar outro índice mais curto para que 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 índices e para 20 (drumroll) 2432902008176640000 índices. Este é um número ridiculamente grande, se colocarmos um ponto para cada índice de um milímetro por peça, um feixe de luz levará 94 dias para passar todos os pontos. Todos e todos, não ;-)

    • 27
  3. The Impaler
    2018-06-14T13:29:21+08:002018-06-14T13:29:21+08:00

    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 será N!. Digamos que uma tabela tenha 10 colunas, então você não tem apenas 10índices possíveis, mas 10!. Ou seja... 3.628.800 ... em uma única mesa. Isso é muito espaço em disco, E/S em disco, cache e tempos de busca.

    Por quê? Alguns motivos:

    • Os índices Lightwwight 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 SQL pode levar muito tempo para decidir qual é melhor usar, especialmente ao usar junções.

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

    • Os índices devem ser mais leves que o heap. Se você está indexando tudo, então o índice se torna tão pesado quanto o heap... algo que anula o propósito do índice.

    • 7
  4. peterh
    2018-06-14T09:47:19+08:002018-06-14T09:47:19+08:00

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

    • Isso causará um alto uso do disco.
    • Vai aumentar muito os INSERTcustos.
    • A maioria dos seus índices nunca será usada.
    • Muitas WHEREexpressões de condição ainda não usam índices, principalmente as mais complexas.
    • 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.
    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve