sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgresql 9.x:Indeks for at optimere `xpath_exists` (XMLEXISTS) forespørgsler

Planlæggeromkostningsparametre

Dette fortæller mig, at din random_page_cost og seq_page_cost er sandsynligvis forkerte. Du er sandsynligvis på lager med hurtig tilfældig I/O - enten fordi det meste af databasen er cachelagret i RAM, eller fordi du bruger SSD, SAN med cache eller andet lager, hvor tilfældig I/O i sagens natur er hurtig.

Prøv:

SET random_page_cost = 1;
SET seq_page_cost = 1.1;

for i høj grad at reducere omkostningsparameterforskellene og derefter køre igen. Hvis det gør jobbet, overveje at ændre disse parametre i postgresql.conf. .

Dine rækketællingsestimater er rimelige, så det ser ikke ud som et problem med planlæggerens fejlvurdering eller et problem med dårlig tabelstatistik.

Forkert forespørgsel

Din forespørgsel er også forkert. OFFSET 0 LIMIT 1 uden en ORDER BY vil producere uforudsigelige resultater, medmindre du er garanteret at have præcis et match, i hvilket tilfælde OFFSET ... LIMIT ... klausuler er unødvendige og kan fjernes helt.

Du er normalt meget bedre stillet ved at formulere sådanne forespørgsler som SELECT max(...) eller SELECT min(...) hvor det er muligt; PostgreSQL har en tendens til at være i stand til at bruge et indeks til bare at plukke den ønskede værdi af uden at lave en dyr tabelscanning eller en indeksscanning og sortering.

Tips

BTW, til fremtidige spørgsmål har PostgreSQL-wikien nogle gode oplysninger i ydelseskategorien og en guide til at stille Spørgsmål til langsomme forespørgsler .




  1. Sådan begrænser du brugeren til kun at uploade tre billeder på en måned ved hjælp af PHP/MySQL

  2. PHP / MYSQL Tilføj knap til kolonne

  3. Hvordan bruger man SQL - INSERT...ON DUPLICATE KEY UPDATE?

  4. Find ud af, om en varchar indeholder et procenttegn, i MySQL