SQL - divisez une grande table en fonction de la fréquence à laquelle vous y accédez? - SQL, postgresql

J'ai une table qui a 50 champs:

  1. 10 champs qui sont presque toujours nécessaires.
  2. 40 champs qui sont très rarement nécessaires.

Je dirais approximativement que les champs dans (1) doivent être consultés 1000 fois plus fréquemment que ceux de (2).

Devrais-je les diviser en deux tables avec une relation un-à-un ou tout conserver dans la même table?

Réponses:

1 pour la réponse № 1

Le processus que vous décrivez est parfoisappelé "partitionnement vertical". À l'extrême (une colonne par partition verticale), voici comment les bases de données en colonnes stockent des données. Malheureusement (à ma connaissance), Postgres ne prend actuellement pas en charge directement le partitionnement vertical.

Votre idée de fractionner les données en deux tables convient parfaitement. Je voudrais noter ce qui suit:

  • Vous devrez modifier les requêtes utilisant les colonnes supplémentaires pour utiliser le second tableau. (Vous pouvez envelopper le join dans une vue que vous utilisez lorsque vous voulez les colonnes supplémentaires.)
  • Si les deux tables ont une clé primaire en cluster qui les connecte, alors le join devrait être très rapide.
  • Si vous insérez / mettez à jour / supprimez des données, vous devez faire attention à la synchronisation. Je pense que vous pouvez gérer cela avec un INSTEAD OF déclencher sur une vue combinant les tables.
  • Si certains enregistrements n'ont pas de colonnes supplémentaires, cela peut être une grande victoire du côté de l'espace.
  • Si tous les enregistrements et toutes les colonnes vont être chargés dans le cache, ce n'est probablement pas une grosse victoire.

Cela peut être une grosse victoire en performance, dans certaines circonstances. Mais il existe un travail manuel supplémentaire pour garder les tables synchronisées.


0 pour la réponse № 2

Il n’ya vraiment pas assez d’informations ici pour estimer quantifier) quels pourraient être les avantages, mais les coûts sont très clairs: code plus complexe, schéma plus complexe, utilisation probablement plus importante de l’espace général et surcharge de performances lors de l’ajout et de la suppression de lignes.

Une amélioration de la performance pourrait venir denumériser une plus petite quantité de données lors d’une analyse complète de la table ou lorsqu’il est plus probable de trouver des blocs de données en mémoire si nécessaire, et une empreinte mémoire globale plus petite, mais sans information spécifique sur les types est sous la pression de la mémoire, aucun conseil fiable ne peut être donné.

Méfiez-vous bien de la complexité de votre système en tant qu'effet secondaire de gains de performance incertains.


Menu