Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je suis une formation de développeur java grâce au site www.blackbeltfactory.com. Dans le cadre d’un projet lors de cette formation, je me pose une question sur la taille d’une table PostgreSQL 9.0 nommée questionnaire_questions qui contient 1 million d’enregistrements avec les champs suivants :
Questionnaireid (integer), Questionid (integer), Questionindex (smallint)
CREATE TABLE questionnaires_questions (
questionnaireid integer NOT NULL,
questionid integer NOT NULL,
questionindex smallint NOT NULL,
CONSTRAINT questionnaires_questions_pkey PRIMARY KEY (questionnaireid, questionindex)
)
WITH (
OIDS=FALSE
);
Théoriquement, la taille des données donne (4bytes+ 4bytes +2bytes) * 1000 000 = 10Mb.
Lorsque je récupère la taille réelle grâce à la requête suivante :
SELECT pg_size_pretty (pg_total_relation_size('public.questionnaires_questions_test'))
J’obtiens une taille de 64Mb. Juste pour des tests, en supprimant la clé primaire, j’obtiens 42Mb.
Quelqu’un pourrait m’expliquer cette différence entre les deux tailles (théorique et réel) et comment la minimiser ?
Dernière modification par lebrunnya (24/11/2010 12:28:39)
Hors ligne
Le problème, c'est que votre théorie est fausse et que votre test est faux.
Commençons par la théorie. Votre table contient trois colonnes utilisateurs, ce qui fait 4+4+2, soit 10 octets pour les informations utilisateurs. À cela vous devez au moins ajouter 5*4+1*6 octets pour chaque ligne (5+1 car 6 colonnes systèmes, et 5*4+1*6 car 5 sont des entiers et 1 est un tableau sur 6 octets), ce qui fait 26 octets de plus par ligne. On arrive donc à environ 36 Mo. À cela, vous ajoutez des informations supplémentaires d'en-tête pour chaque bloc, et on arrive à un total de 42 Mo (sur mon portable, avec une 9.0).
Pourquoi n'arrive-je pas à 64 Mo comme vous ? tout simplement parce que votre test est faux. Vous utilisez pg_total_relation_size() comme si cela allait vous donner la taille de la table. C'est faux. Cela donne la taille de la table et des index associés. pg_relation_size() vous aurait donné la taille de la table. Et dans ce cas, vous arrivez bien à 42 Mo. C'est l'index qui ajoute 21 Mo. Index créé par l'ajout de la clé primaire (d'où le fait que vous arrivez à 42 Mo une fois l'index supprimé).
Pour répondre à votre dernière question, vous ne pouvez pas la minimiser. PostgreSQL a besoin de stocker des informations supplémentaires qui permettent un tas de fonctionnalités intéressantes comme le transactionnel.
Guillaume.
Hors ligne
Merci beaucoup pour votre réponse.
Les éléments de réponse que j'ai obtenu sont clairs.
Bien a vous.
Lebrun Nya
Hors ligne
Pages : 1