PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment puis-je utiliser un index sur une table partitionnée dans postgresql 8.3.7

Les index fonctionnent très bien pour effectuer une analyse uniquement des partitions pertinentes dans PostgreSQL. Mais, vous devez tout configurer correctement pour que cela fonctionne, et il est facile de manquer une étape dans la longue liste de choses documentées sur http://www.postgresql.org/docs/current/static/ddl-partitioning.html

La principale chose à réaliser est que pour éviter une analyse séquentielle, vous devez fournir suffisamment d'informations à PostgreSQL pour qu'il puisse prouver que certaines partitions ne peuvent pas contenir les données que vous recherchez; ils sont ensuite ignorés en tant que sources potentielles pour les résultats de la requête. L'article auquel vous liez le souligne comme une solution au problème d'analyse de séquence :"Si vous ajoutez des contraintes de plage au champ de date de chaque partition, cette requête peut être optimisée dans une boucle où vous interrogez d'abord la "dernière" partition et travaillez vers l'arrière jusqu'à ce que vous trouviez une seule valeur supérieure à la plage de toutes les partitions restantes." - mais n'affiche pas le plan amélioré que vous verriez après ce changement.

Certaines erreurs courantes que vous avez pu commettre :

-Le paramètre de contrainte_exclusion dans le fichier postgresql.conf est désactivé par défaut. Avec cette valeur par défaut, vous n'obtiendrez pas ce que vous attendez.

-N'a pas créé de partitions sans chevauchement à l'aide de CHECK, ce qui empêche le planificateur de savoir ce qu'il y a à l'intérieur de chacune d'elles. Il est possible de rater cette étape mais de placer correctement vos données dans les bonnes partitions, le planificateur ne le saura tout simplement pas.

-N'a pas mis d'index sur chaque partition, n'en a créé qu'un sur la table maître. Cela vous donnera une analyse séquentielle uniquement sur la partition concernée, donc pas aussi mauvaise que celle ci-dessus mais pas bonne non plus.

Il y a du travail pour rendre tout cela plus facile dans les prochaines versions de PostgreSQL (la définition de la contrainte_partition est assez automatique dans la version 8.4 et une sorte d'automatisation de la configuration de la partition est en cours d'élaboration). En ce moment, si vous suivez attentivement les instructions et évitez tous ces problèmes, cela devrait fonctionner.