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.
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.
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:
À 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.
Un index sur (emplacement, horodatage) devrait mieux fonctionner que 2 index distincts pour votre cas. Notez que l'ordre des colonnes est important.