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

Comment puis-je améliorer les performances des requêtes basées sur la date sur une grande table ?

Une vue matérialisée est la voie à suivre pour ce que vous avez décrit. L'interrogation des mois précédents de données en lecture seule fonctionne sans les actualiser. Vous pouvez choisir un cas particulier pour le mois en cours si vous avez également besoin de le couvrir.

La requête sous-jacente peut toujours bénéficier d'un index, et vous pouvez prendre deux directions :

Tout d'abord, index partiels comme vous l'avez maintenant n'achètera pas grand-chose dans votre scénario, cela n'en vaut pas la peine. Si vous collectez beaucoup plus de mois de données et que vous interrogez principalement par mois (et ajoutez/supprimez des lignes par mois) partitionnement de table pourrait être une idée, alors vos index sont également partitionnés automatiquement. Je considérerais Postgres 11 ou même le prochain Postgres 12 pour cela, cependant.)

Si vos lignes sont larges , créez un index qui autorise les analyses d'index uniquement . Comme :

CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal, views, gender);

Connexe :

Ou INCLUDE colonnes supplémentaires dans Postgres 11 ou version ultérieure :

CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal) INCLUDE (views, gender);

Autre , si vos lignes sont triées physiquement par datelocal , considérez un index BRIN . Il est extrêmement petit et probablement aussi rapide qu'un index B-tree pour votre cas. (Mais étant si petit, il restera en cache beaucoup plus facilement et ne poussera pas autant les autres données.)

CREATE INDEX reportimpression_brin_idx ON reportimpression USING BRIN (datelocal);

Vous pourriez être intéressé par CLUSTER ou pg_repack pour trier physiquement les lignes du tableau. pg_repack peut le faire sans verrous exclusifs sur la table et même sans index btree (requis par CLUSTER ). Mais c'est un module supplémentaire qui n'est pas fourni avec la distribution standard de Postgres.

Connexe :