sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgresql 9.x:Index för att optimera "xpath_exists" (XMLEXISTS)-frågor

Kostnadsparametrar för planerare

Detta säger mig att din random_page_cost och seq_page_cost är förmodligen fel. Du är troligen på lagring med snabb slumpmässig I/O - antingen för att större delen av databasen är cachad i RAM eller för att du använder SSD, SAN med cache eller annan lagring där slumpmässig I/O är i sig snabb.

Försök:

SET random_page_cost = 1;
SET seq_page_cost = 1.1;

för att avsevärt minska skillnaderna i kostnadsparametrar och sedan köra om. Om det gör jobbet, överväg att ändra dessa parametrar i postgresql.conf. .

Dina radräkningsuppskattningar är rimliga, så det ser inte ut som ett feluppskattningsproblem eller ett problem med dålig tabellstatistik.

Felaktig fråga

Din fråga är också felaktig. OFFSET 0 LIMIT 1 utan en ORDER BY kommer att ge oförutsägbara resultat om du inte är garanterad att ha exakt en matchning, i vilket fall OFFSET ... LIMIT ... klausuler är onödiga och kan tas bort helt.

Du är vanligtvis mycket bättre av att formulera sådana frågor som SELECT max(...) eller SELECT min(...) om möjligt; PostgreSQL tenderar att kunna använda ett index för att bara plocka bort det önskade värdet utan att göra en dyr tabellskanning eller en indexskanning och sortering.

Tips

BTW, för framtida frågor har PostgreSQL-wikin lite bra information i prestandakategorin och en guide för att ställa långsamma frågor .




  1. Hur man normaliserar kommaseparerade värden i tabellkolumnen och kör sedan en fråga

  2. Hur använder man Enums i Scala Slick?

  3. SQL max() med inre kopplingar

  4. Laravel - fyll i saknade datum och räkningar från databasen