2015-07-22 1 views
2

Je suis nouveau sur le partitionnement de PostgreSQL (version 9) et j'ai besoin d'un conseil s'il vous plait. J'ai un ensemble de parties pour le pays A et un autre ensemble de parties pour le pays B. Chaque ensemble a environ deux millions d'enregistrements. J'ai besoin de charger les deux ensembles dans la base de données. Chaque ensemble doit être mis à jour chaque semaine. En mettant à jour l'ensemble, je veux dire effacer toutes les données d'un ensemble et le charger à nouveau à partir d'un fichier. Les ensembles doivent être mis à jour de manière indépendante, je ne dois donc pas effacer les données de l'ensemble B. Lorsque je stocke chaque ensemble dans une partition séparée, je peux tronquer chaque partition indépendamment, ce qui est beaucoup plus rapide que la suppression des enregistrements. J'ai donc décidé de le faire de cette façon (il y a plus de colonnes dans la table « partie », mais ils ne sont pas importants pour cette question):Partitionnement et indexation PostgreSQL

CREATE TABLE part (
    country   CHAR(3) NOT NULL, 
    manufacturer_code CHAR(2) NOT NULL, 
    part_code   CHAR(4) NOT NULL, 
    part_description VARCHAR(100) 
); 

CREATE TABLE part_cze (
    CHECK (country = 'CZE') 
) INHERITS (part); 

CREATE INDEX idx__part_cze ON part_cze (part_code, manufacturer_code); 

CREATE TABLE part_svk (
    CHECK (country = 'SVK') 
) INHERITS (part); 

CREATE INDEX idx__part_svk ON part_svk (part_code, manufacturer_code); 

Le tableau des requêtes d'application « partie » pour récupérer les données. La requête peut ressembler à ceci:

SELECT * FROM part WHERE country='CZE' AND part_code='4578' AND manufacturer_code='22' 

Mes questions:

  1. est le schéma ci-dessus correct ou recommanderiez-vous autre chose?
  2. Ai-je besoin d'index sur la table part ou part_cze? Si je comprends bien Postgres récupère les données de la table part_cze qui a l'index de sorte que la table part ne devrait pas en avoir besoin.
  3. L'index idx__part_cze doit-il contenir un pays de colonne ou suffit-il que les données soient séparées en partitions par le pays?
  4. Si j'ai créé l'index sur la table part, doit-il contenir la colonne country?

Répondre

0
  1. Attend bien, sauf que vous ne définissez pas les clés primaires, mais ce n'est pas une exigence pour Postgres.

  2. Aucun index nécessaire sur 'partie' tant qu'il n'y a pas de quantité significative de données dans cette table.

  3. pays ne devrait pas être dans l'index postgres sélectionnera la bonne table en fonction des contraintes de vérification. Mettre le pays dans l'index ne servira qu'à rendre l'indice plus grand et donc moins efficace.

  4. Créez uniquement un index sur une pièce si vous mettez une quantité significative de données dans cette table. Ensuite, selon les requêtes et les données réelles dans le tableau, il peut ou non aider à mettre pays dans l'index.