sql >> Databasteknik >  >> RDS >> PostgreSQL

Långsamt körande Postgres-fråga

Orsaken till långsamheten är de dåliga radräkningsuppskattningarna som gör att PostgreSQL väljer en kapslad loop-join. Nästan all din tid spenderas på indexskanningen på hfj_res_link , som upprepas 1113 gånger.

Mitt första försök skulle vara att ANALYZE hfj_spidx_date och se om det hjälper. Om ja, se till att autoanalyze behandlar den tabellen oftare.

Nästa försök skulle vara att

SET default_statistics_target = 1000;

och sedan ANALYZE som ovan. Om det hjälper, använd ALTER TABLE för att öka STATISTICShash_identity och sp_value_high kolumner.

Om det inte heller hjälper, och du har en ny version av PostgreSQL, kan du prova utökad statistik :

CREATE STATISTICS myparamsda2_stats (dependencies)
   ON hash_identity, sp_value_high FROM hfj_spidx_date;

Sedan ANALYZE tabellen igen och se om det hjälper.

Om allt detta inte hjälper och du inte kan få uppskattningarna korrekta, måste du prova en annan vinkel:

CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);

Det borde påskynda indexsökningen avsevärt och ge dig bra svarstider.

Slutligen, om inget av ovanstående har någon effekt, kan du använda cruse-måttet för att inte tillåta kapslade loop-kopplingar för den här frågan:

BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;



  1. Vad betyder "välj" samma tabell som "från"?

  2. PostgreSQL JDBC nollsträng tagen som en byte

  3. Skillnad mellan numerisk, float och decimal i SQL Server

  4. Rails 3.0.3 - Oracle_enhanced fungerar inte