Question

J'ai 2 tables avec les schémas ci-dessous avec le même nombre de lignes. Quand je lance la commande SELECT relname, relpages FROM pg_class ORDER BY relpages DESC, ils apparaissent comme 23GB chacun, même si les types de données (nombre total d'octets) pour Thew deux schémas donnent lieu à différentes tailles. Quelle est la meilleure façon de savoir combien d'espace je sauverais en combinant tables? Aussi, est-il un moyen de déterminer, la quantité d'espace chaque ligne est en réalité Reprenant?

                                 Table "public.table1"
Column        |           Type           |                      Modifiers                      
--------------+--------------------------+-----------------------------------------------------

 field1       | smallint                 | 
 field2       | smallint                 | 
 field3       | integer                  | 
 field4       | smallint                 | 
 timestamp    | timestamp with time zone | 
 user_id      | integer                  | 
 status       | boolean                  | 
 id           | integer                  | not null default 

                                  Table "public.table2"
 Column          |           Type           |                     Modifiers                      
 ----------------+--------------------------+----------------------------------------------------
 user_id         | integer                  | 
 begin_timestamp | timestamp with time zone | 
 end_timestamp   | timestamp with time zone | 
 field           | smallint                 | not null
 id              | integer                  | not null default 
Était-ce utile?

La solution

Une réponse raisonnable à cette nécessité à mon humble avis demander (ou au moins implique) la question: Pourquoi les tableaux séparés pour commencer? (Plus important encore: faut-il appliquer encore?)

Le cas général: Je ne connais pas les détails de la façon dont les travaux de base de données Postgres moteur, mais la limite inférieure de l'espace disque économisé peut être pas plus grand que la taille des colonnes enlevé + index des variables en double + Un bit de données d'entretien ménager

La limite supérieure est également assez faible, donc il ne va probablement pas être en vaut la peine; il peut même être qu'ils ont été partitionnés pour des raisons de performance - parce que certaines colonnes seraient accessibles (lire, ou même mis à jour) plus souvent, et en tant que tel, il pourrait être de petite taille (moins de colonnes) pour le rendre plus rapide. (À une sanction pour accéder à des colonnes des deux en même temps.)

Le cas spécifique: On dirait qu'il ya beaucoup de champs redondants entre eux. user_id, par exemple, ne serait pas besoin d'être là deux fois. début / fin / X horodatages pourrait peut-être réduit à deux ou un. Donc, il pourrait y avoir une légère économie de cela, en fonction des besoins de l'application. Encore une fois, essayez de comprendre pourquoi ils l'ont fait pour commencer.

Dans l'ensemble, cependant, je suis d'accord avec Bryan Agee; l'espace disque ne devrait probablement pas être votre préoccupation sur quoi que ce soit assez grand pour courir de postgres pour commencer. En particulier si vous êtes payé pour le temps que vous passez sur « fixer » cela, que le coût est susceptible de dépasser le coût du plus grand disque par lui-même.

espace par ligne: Je suis peu familiarisés avec les détails de Postgres, si quelqu'un dans le savoir devrait être en mesure de corriger quoi que ce soit de mal. Tels que qu'il y ait moyen de demander postgres combien d'espace cette ligne spécifique est en réalité Reprenant; Je ne sais pas. Ce que je suis l'écriture est essentiellement la théorie derrière le stockage de base de données (je crois) fait couramment aujourd'hui.

Chaque champ a un bit (dans un octet qui lui est propre, ou dans un courant de bitset pour la rangée entière) qui indique si la valeur est une valeur nulle ou non. Si c'est une valeur nulle, il n'y a rien de plus stocké. Ensuite, il y a un octet de longueur - à moins que cela est implicite des types de données à largeur fixe. Ensuite, il y a les données elles-mêmes.

Ainsi, une rangée d'une int (même 64 bits) et trois valeurs nulles peut prendre aussi peu que 3 octets. (Pour des valeurs <127, le stockage size = 1 et l'octet). En plus des index et divers autres métadonnées ménage . Encore une fois, je ne sais pas à quel point postgres va à cet égard. Et tous ces facteurs pris ensemble ont tendance à faire « comment bien cette ligne occupent » une question avec une réponse inutile.

postgres afaik fonctionne également avec « pages » - blocs d'espace qu'une ligne ne peut pas être stocké dans les limites de. Ainsi, les dossiers plus importants peuvent se retrouver plus souvent « tout simplement pas raccord » dans une page et si besoin d'être placé dans une autre / nouvelle page.

Autres conseils

Parce que la table combinée résultante aurait des lignes non utilisées pour les enregistrements de chaque table respective, la probabilité est que vous ne seriez pas gagner de l'espace, mais le perdre.

Plus important encore que cela, je déconseille fortement de prendre une décision d'architecture de cette nature, pour des raisons de l'espace disque. Les disques ne coûtent pas cher - une application bien conçue et fonctionnelle est pas. S'il y a un problème de performances d'exécution (tous les 46 Go est en cours de chargement dans l'espace mémoire / swap) alors vous pouvez avoir une optimisation et l'émission d'accord sur vos mains.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top