sql >> Databasteknik >  >> RDS >> PostgreSQL

Konfigurationsparameter work_mem i PostgreSQL på Linux

Jag lade upp din frågeplan på explain.depesz.com, ta en titt.

Frågeplanerarens uppskattningar är väldigt felaktiga på vissa ställen. Har du kört ANALYZE nyligen?

Läs kapitlen i manualen om statistik som används av planerare och planerare kostnadskonstanter. Var särskilt uppmärksam på kapitlen om random_page_cost och default_statistics_target .
Du kan försöka:

ALTER TABLE diplomas ALTER COLUMN number SET STATISTICS 1000;
ANALYZE diplomas;

Eller gå ännu högre för en tabell med 10 miljoner rader. Det beror på datadistribution och faktiska frågor . Experimentera. Standard är 100, max är 10 000.

För en databas av den storleken, endast 1 eller 5 MB work_mem är i allmänhet inte tillräckligt. Läs Postgres Wiki-sida på Tuning Postgres som @aleroot länkade till.

Eftersom din fråga behöver 430104kB minne på disk enligt EXPLAIN output måste du ställa in work_mem till något som 500 MB eller mer för att tillåta sortering i minnet. In-memory-representation av data kräver lite mer utrymme än på disk-representation. Du kanske är intresserad av vad Tom Lane skrev om den saken nyligen.

Ökar work_mem med bara lite, som du försökte, hjälper inte mycket eller kan till och med sakta ner. Att sätta den till hög globalt kan till och med skada, särskilt med samtidig åtkomst. Flera sessioner kan svälta varandra efter resurser. Att allokera mer för ett syfte tar bort minne från ett annat om resursen är begränsad. Den bästa inställningen beror på hela situationen.

För att undvika biverkningar, ställ bara in den tillräckligt hög lokalt i din session och tillfälligt för frågan:

SET work_mem = '500MB';

Återställ den till din standard efteråt:

RESET work_mem;

Eller använd SET LOCAL för att ställa in den bara för den aktuella transaktionen till att börja med.



  1. OracleException (0x80004005) vid anslutning till Oracle Database

  2. String -> java.util.Date -> java.sql.Date (med tidsstämpel)

  3. SQL 'LIKE'-fråga med '%' där sökkriteriet innehåller '%'

  4. Verklig vs flytande poäng vs. pengar