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 / 99174
Accepted
Urim Kurtishi
Urim Kurtishi
Asked: 2015-04-30 11:11:34 +0800 CST2015-04-30 11:11:34 +0800 CST 2015-04-30 11:11:34 +0800 CST

Muitas colunas versus poucas tabelas - desempenho sábio

  • 772

Sim, estou ciente de que a normalização dos dados deve ser minha prioridade (como está).

  1. Tenho uma tabela com 65 colunas armazenando dados de veículos com colunas: used_vehicle, color, doors, mileage, pricee assim por diante, totalizando 65.
  2. Agora, posso dividir isso e ter uma Vehicletabela, VehicleInterior, VehicleExterior, VehicleTechnical, VehicleExtra(todos um-para-um com a Vehicletabela principal).

Vamos supor que terei cerca de 5 milhões de linhas (veículos).

On SELECTcom uma WHEREcláusula: O desempenho será melhor pesquisando (ambos os casos indexados pelo menos em IDs):

  1. Vehicletabela com 65 colunas ou
  2. Vehicletabela com JOINSoutras quatro tabelas (todas com 5 milhões de linhas) para retornar todos os dados relacionados a Vehicle?

(De acordo com o mecanismo de banco de dados, considere PostgreSQL e/ou MySQL).

Aprecia verdadeiramente quaisquer insights detalhados que você possa ter de sua experiência anterior?

As atualizações serão raras, se houver, e as seleções serão principalmente para todas as colunas (página de detalhes do veículo) e informações principais (algumas colunas) para a lista de resultados de pesquisa e, de fato, talvez a melhor solução seja duas tabelas: uma com informações principais (algumas colunas) e a outra tabela com o restante das colunas.

database-design postgresql
  • 2 2 respostas
  • 19089 Views

2 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2015-04-30T11:59:14+08:002015-04-30T11:59:14+08:00

    Assumindo que estamos falando de relacionamentos 1:1 entre todas as tabelas.

    O armazenamento geral é praticamente sempre (substancialmente) mais barato com uma única tabela em vez de várias tabelas na relação 1:1. Cada linha tem 28 bytes de sobrecarga, além de mais alguns bytes para preenchimento extra. E você precisa armazenar a coluna PK com cada tabela. E tenha um índice separado (redundante) em cada uma dessas colunas... O tamanho importa para o desempenho.

    Isso é verdade mesmo se muitas colunas forem NULL na maioria das linhas porque o armazenamento NULL é muito barato :

    • Configurando o PostgreSQL para desempenho de leitura

    Ao recuperar todas as colunas, uma única tabela é substancialmente mais rápida do que 5 tabelas unidas. Também é muito mais simples . Cinco tabelas podem ser difíceis de juntar se nem todas as linhas estiverem presentes em todas as tabelas. Com WHEREcondições direcionadas a uma única tabela, é fácil anexar outras tabelas com LEFT JOIN. Não é tão trivial se você tiver predicados em várias tabelas ...

    O particionamento vertical ainda pode melhorar o desempenho de determinadas consultas. Por exemplo, se 90% de suas consultas recuperam as mesmas 5 colunas das 65 disponíveis, isso seria mais rápido com uma tabela contendo apenas essas 5 colunas.

    • O que é recuperado do disco durante uma consulta? (minha resposta)

    OTOH, você pode atender a essas consultas em algumas colunas selecionadas com um índice de "cobertura" que permite varreduras somente de índice .

    Outro candidato para particionamento vertical: se você tiver muitas atualizações em apenas algumas colunas, enquanto o restante quase nunca muda. Pode ser consideravelmente mais barato dividir linhas nesse caso, já que o Postgres escreve uma nova versão de linha para cada atualização. Há exceções para grandes valores armazenados fora de linha ("TOASTed"). Mais detalhes:

    • O que é recuperado do disco durante uma consulta? (resposta de Daniel)
    • Atualize todas as colunas de outra tabela

    Realmente depende da situação completa. Em caso de dúvida, opte pela solução simples de ter uma única mesa, principalmente se ela retratar bem a realidade: No seu exemplo, todos esses são atributos de um carro e fazem sentido juntos.

    • 27
  2. Sir Swears-a-lot
    2015-04-30T11:30:21+08:002015-04-30T11:30:21+08:00

    Uma seleção em uma única mesa pode ser mais rápida. (Mas não sempre). Se você tivesse todos os dados em uma única tabela plana, depois de encontrar seu veículo, você já teria todos os detalhes. No entanto, isso pode envolver mais E/S e potencialmente mais atraso.

    Você também perde a eficiência da normalização. Por exemplo, se 1 carro tiver muitos modelos com diferentes opções. Com dados normalizados, você poderia retornar todo o conjunto de registros com menos E/S do que se estivesse em uma tabela de fatos. Mesmo que o mecanismo de banco de dados precise fazer mais computação, ainda pode ser mais rápido.

    Este é um db de referência de todos os carros? Ou uma lista de veículos em segunda mão? Haveria muitos exemplos da mesma marca/modelo com as mesmas opções?

    Devo qualificar minha resposta como sendo rdbms genéricos em vez de específicos do Postgres. Eu defiro a resposta detalhada de Erwin específica para Postgres.

    • 1

relate perguntas

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

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