web-dev-qa-db-fra.com

Index multiples vs index unique sur plusieurs colonnes dans postgresql

Je n'ai pas pu obtenir de réponses concluantes en lisant certains des messages existants sur ce sujet.

J'ai certaines données dans 100 emplacements depuis 10 ans. Le tableau compte environ 800 millions de lignes. J'ai besoin de générer principalement des statistiques annuelles pour chaque emplacement. Parfois, je dois également générer des statistiques de variation mensuelles et des statistiques de variation horaire. Je me demande si je dois générer deux index - un pour l'emplacement et un autre pour l'année ou générer un index à la fois pour l'emplacement et l'année. Ma clé primaire est actuellement un numéro de série (je pourrais probablement utiliser l'emplacement et l'horodatage comme clé primaire).

Merci.

17
let_there_be_light

Quel que soit le nombre d'indices que vous avez créés sur la relation, un seul d'entre eux sera utilisé dans une certaine requête (lequel dépend de la requête, des statistiques, etc.). Donc, dans votre cas, vous ne bénéficieriez pas d'un avantage cumulatif de la création de deux indices à colonne unique. Pour obtenir la plupart des performances de l'index, je suggère d'utiliser l'index composite sur (emplacement, horodatage).

Notez que les requêtes comme ... WHERE timestamp BETWEEN smth AND smth n'utilisera pas l'index ci-dessus pendant les requêtes comme ... WHERE location = 'smth' ou ... WHERE location = 'smth' AND timestamp BETWEEN smth AND smth volonté. C'est parce que le premier attribut de l'index est crucial pour la recherche et le tri.

N'oubliez pas de jouer

ANALYZE;

après la création de l'index afin de collecter des statistiques.

pdate: Comme @ MondKin mentionné dans les commentaires, certaines requêtes peuvent en fait utiliser plusieurs index sur la même relation. Par exemple, interrogez avec des clauses OR comme a = 123 OR b = 456 (en supposant qu'il existe des index pour les deux colonnes). Dans ce cas, postgres effectuerait des analyses d'index bitmap pour les deux index, créerait une union des bitmaps résultants et l'utiliserait pour l'analyse de tas bitmap. Dans certaines conditions, le même schéma peut être utilisé pour les requêtes AND mais au lieu de l'union, il y aurait une intersection.

18
Ildar Musin

Il n'y a pas de règle empirique pour des situations comme celles-ci, je vous suggère d'expérimenter dans une copie de votre base de données de production pour voir ce qui vous convient le mieux: un index multi-colonnes unique ou 2 index mono-colonne.

Une fonctionnalité intéressante de Postgres est que vous pouvez avoir plusieurs index et les utiliser dans la même requête. Vérifiez ce chapitre de la documentation :

... PostgreSQL a la possibilité de combiner plusieurs index ... pour gérer les cas qui ne peuvent pas être implémentés par des analyses d'index unique ....

... Parfois, les index multicolonnes sont les meilleurs, mais parfois il est préférable de créer des index séparés et de s'appuyer sur la fonction de combinaison d'index ...

Vous pouvez même expérimenter la création des index individuels et combinés, et vérifier quelle est la taille de chacun et déterminer s'il vaut la peine de les avoir en même temps.

Certaines choses que vous pouvez également expérimenter:

  • Si votre table est trop grande, pensez à la partitionner . Il semble que vous puissiez partitionner par emplacement ou par date. Le partitionnement divise les données de votre table en tables plus petites, réduisant ainsi le nombre d'emplacements où une requête doit être consultée.
  • Si vos données sont présentées selon une date (comme la date de la transaction), vérifiez index BRIN .
  • Si plusieurs requêtes traitent vos données de la même manière (comme l'agrégation de toutes les transactions sur la même période, cochez vues matérialisées afin que vous n'ayez à effectuer ces agrégations coûteuses qu'une seule fois.

À propos de l'ordre dans lequel placer votre index multi-colonnes, placez d'abord la colonne sur laquelle vous aurez une opération d'égalité, puis la colonne dans laquelle vous avez une plage, >= ou <= opération.

5
MondKin

Un index sur (emplacement, horodatage) devrait mieux fonctionner que 2 index distincts pour votre cas. Notez que l'ordre des colonnes est important.

1
redneb