SQL - dividir uma tabela grande de acordo com a frequência com que são acessados? - sql, postgresql

Eu tenho uma tabela que tem 50 campos:

  1. 10 Campos quase sempre necessários.
  2. 40 Campos que são muito raramente necessários.

Eu diria que os campos em (1) são necessários para serem acessados ​​1000 vezes mais frequentemente que os campos em (2).

Devo dividi-los em duas tabelas com uma relação de um para um ou manter todos na mesma mesa?

Respostas:

1 para resposta № 1

O processo que você está descrevendo é às vezesreferido como "particionamento vertical". Levado ao extremo (uma coluna por partição vertical), é assim que os bancos de dados colunares armazenam dados. Infelizmente (tanto quanto é do meu conhecimento), o Postgres atualmente não tem suporte direto para o particionamento vertical.

Sua idéia de dividir os dados em duas tabelas está bem. Eu observaria o seguinte:

  • Você precisará modificar as consultas que usam as colunas extras para usar a segunda tabela. (Você pode embrulhar o join em uma exibição que você usa quando deseja as colunas extras.)
  • Se ambas as tabelas tiverem uma chave primária em cluster que as conecte, join deve ser muito rápido.
  • Se você estiver inserindo / atualizando / excluindo dados, precisará ter cuidado com a sincronização. Eu acho que você pode lidar com isso com um INSTEAD OF disparar em uma visão combinando as tabelas.
  • Se alguns registros não tiverem colunas extras, isso pode ser uma grande vitória no lado do espaço.
  • Se todos os registros e todas as colunas forem carregadas no cache, isso provavelmente não é uma grande vitória.

Esta pode ser uma grande vitória de desempenho, sob algumas circunstâncias. Mas há trabalho manual adicional para manter as tabelas sincronizadas.


0 para resposta № 2

Não há informações suficientes para estimar (não importa, na verdade, quantificar) quais são os benefícios, mas os custos são muito claros - código mais complexo, um esquema mais complexo, provavelmente maior uso geral de espaço e uma sobrecarga de desempenho ao adicionar e remover linhas.

Uma melhoria de desempenho pode vir devarredura de uma quantidade menor de dados ao executar uma varredura completa da tabela ou de uma maior probabilidade de localizar blocos de dados na memória quando necessário e uma área de memória menor, mas sem informações específicas sobre os tipos de operação comumente executados e se o servidor está sob pressão de memória, nenhum conselho confiável pode ser dado.

Tenha muito cuidado ao tornar seu sistema mais complexo como efeito colateral de ganhos incertos de desempenho.


Cardápio