SQL: dividere una tabella grande in base alla frequenza con cui sono accessibili? - sql, postgresql

Ho una tabella che ha 50 campi:

  1. 10 campi che sono quasi sempre necessari.
  2. 40 Campi che sono molto raramente necessari.

Direi approssimativamente che i campi in (1) sono necessari per accedere a 1000 volte più frequentemente dei campi in (2).

Devo dividerli a due tavoli con una relazione uno a uno o tenere tutti nella stessa tabella?

risposte:

1 per risposta № 1

Il processo che stai descrivendo è a voltedenominato "partizionamento verticale". Portato ad un estremo (una colonna per partizione verticale), questo è il modo in cui i database colonnari memorizzano i dati. Sfortunatamente (per quanto a mia conoscenza), Postgres non ha attualmente un supporto diretto per il partizionamento verticale.

La tua idea di dividere i dati in due tabelle va bene. Vorrei notare quanto segue:

  • Sarà necessario modificare le query che utilizzano le colonne aggiuntive per utilizzare la seconda tabella. (Puoi avvolgere il join in una vista che usi quando vuoi le colonne extra.)
  • Se entrambe le tabelle hanno una chiave primaria in cluster che le connette, allora il join dovrebbe essere veramente veloce
  • If you are inserting/updating/deleting data, then you need to be careful about synchronization. I think you can handle this with an INSTEAD OF trigger su una vista che combina i tavoli.
  • Se alcuni record non hanno colonne aggiuntive, questa può essere una grande vittoria sul lato spazio.
  • Se tutti i record e tutte le colonne verranno caricati nella cache, probabilmente non è una grande vittoria.

Questa può essere una grande vittoria per le prestazioni, in alcune circostanze. Ma c'è un lavoro manuale aggiuntivo per mantenere sincronizzate le tabelle.


0 per risposta № 2

Non ci sono davvero abbastanza informazioni qui da stimare (non importa davvero quantificare) quali sono i vantaggi, ma i costi sono molto chiari: codice più complesso, uno schema più complesso, probabilmente un maggiore utilizzo complessivo dello spazio e un sovraccarico delle prestazioni quando si aggiungono e rimuovono le righe.

Potrebbe venire un miglioramento delle prestazioniscansione di una quantità minore di dati durante l'esecuzione di una scansione completa della tabella o da un'aumentata probabilità di trovare blocchi di dati nella memoria quando richiesto e un ingombro di memoria complessivo inferiore, ma senza informazioni specifiche sui tipi di operazione comunemente eseguiti e se il server è sotto pressione di memoria, nessun consiglio affidabile può essere dato.

Fai molta attenzione a rendere il tuo sistema più complesso come un effetto collaterale di incerti miglioramenti nelle prestazioni.


Menu