En materialiserad vy är vägen att gå för det du beskrev. Att söka efter senaste månaders skrivskyddad data fungerar utan att uppdatera den. Du kanske vill specialanpassa den aktuella månaden om du också behöver täcka det.
Den underliggande frågan kan fortfarande dra nytta av ett index, och det finns två riktningar du kan ta:
Först och främst, partiella index som du har nu kommer inte att köpa mycket i ditt scenario, inte värt det. Om du samlar in många fler månaders data och mestadels frågar efter månad (och lägger till / släpper rader efter månad) tabellpartitionering kan vara en idé, då har du dina index partitionerade automatiskt också. Jag skulle dock överväga Postgres 11 eller till och med den kommande Postgres 12 för detta.)
Om dina rader är breda , skapa ett index som tillåter index-endast genomsökningar . Gilla:
CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal, views, gender);
Relaterat:
Eller INCLUDE
ytterligare kolumner i Postgres 11 eller senare:
CREATE INDEX reportimpression_covering_idx ON reportimpression(datelocal) INCLUDE (views, gender);
Annat , om dina rader är fysiskt sorterade efter datelocal
, överväg ett BRIN-index
. Det är extremt litet och förmodligen ungefär lika snabbt som ett B-trädindex för ditt fall. (Men eftersom den är så liten kommer den att förbli cachad mycket lättare och inte pressa ut annan data lika mycket.)
CREATE INDEX reportimpression_brin_idx ON reportimpression USING BRIN (datelocal);
Du kanske är intresserad av CLUSTER
eller pg_repack
för att fysiskt sortera tabellrader. pg_repack
kan göra det utan exklusiva lås på bordet och även utan ett btree-index (krävs av CLUSTER
). Men det är en extra modul som inte levereras med standarddistributionen av Postgres.
Relaterat:
- Optimize Postgres-radering av föräldralösa poster
- Hur tar man tillbaka diskutrymme efter borttagning utan att bygga om tabellen?