sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur förbättrar jag datumbaserad frågeprestanda på ett stort bord?

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:



  1. http://localhost/phppgadmin/ -> 403 Förbjudet

  2. SQL-fråga för att ta bort dubbletter av värden i en inre koppling med 3 tabeller med två olika databaser

  3. byta från MySQL till PostgreSQL för Ruby on Rails för Herokus skull

  4. SQL Server:Databasen har fastnat i återställningsläge