PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie verbessere ich die datumsbasierte Abfrageleistung für eine große Tabelle?

Eine materialisierte Ansicht ist der richtige Weg für das, was Sie skizziert haben. Das Abfragen von schreibgeschützten Daten der letzten Monate funktioniert ohne Aktualisierung. Möglicherweise möchten Sie den aktuellen Monat in einen Sonderfall umwandeln, wenn Sie auch diesen abdecken müssen.

Die zugrunde liegende Abfrage kann dennoch von einem Index profitieren, und es gibt zwei mögliche Richtungen:

Zunächst einmal Teilindizes wie Sie jetzt haben, wird in Ihrem Szenario nicht viel kaufen, es lohnt sich nicht. Wenn Sie viele weitere Monate an Daten sammeln und hauptsächlich nach Monat abfragen (und Zeilen nach Monat hinzufügen / löschen), Tabellenpartitionierung wäre eine Idee, dann haben Sie Ihre Indizes auch automatisch partitioniert. Ich würde jedoch Postgres 11 oder sogar das kommende Postgres 12 dafür in Betracht ziehen.)

Wenn Ihre Reihen breit sind , erstellen Sie einen Index, der Nur-Index-Scans zulässt . Wie:

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

Verwandte:

Oder INCLUDE zusätzliche Spalten in Postgres 11 oder höher:

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

Sonst , wenn Ihre Zeilen physisch nach datelocal sortiert sind , betrachten Sie einen BRIN-Index . Es ist extrem klein und wahrscheinlich so schnell wie ein B-Tree-Index für Ihren Fall. (Aber da es so klein ist, bleibt es viel einfacher im Cache und schiebt nicht so viele andere Daten heraus.)

CREATE INDEX reportimpression_brin_idx ON reportimpression USING BRIN (datelocal);

Sie könnten an CLUSTER interessiert sein oder pg_repack um Tabellenzeilen physisch zu sortieren. pg_repack kann dies ohne exklusive Sperren auf der Tabelle tun und sogar ohne einen btree-Index (erforderlich von CLUSTER ). Aber es ist ein zusätzliches Modul, das nicht mit der Standarddistribution von Postgres ausgeliefert wird.

Verwandte: