sql >> Databáze >  >> RDS >> PostgreSQL

Jak porozumět EXPLAIN ANALYZE

I když to není tak užitečné pro jednoduchý plán, jako je tento, http://explain.depesz.com je opravdu užitečné. Viz http://explain.depesz.com/s/t4fi. Všimněte si karty „statistiky“ a rozbalovací nabídky „možnosti“.

Poznámky k tomuto plánu:

  • Odhadovaný počet řádků (183) je přiměřeně srovnatelný se skutečným počtem řádků (25). Není to stokrát více, ani to není 1. Pokud jde o odhady počtu řádků, nebo problémy „1 vs ne 1“ vás zajímají spíše řády. (Nepotřebujete ani přesnost „dostatečně blízko pro vládní práci“ – stačí „dostatečně blízko pro vojenské kontraktační účetnictví“). Odhad selektivity a statistiky se zdají rozumné.

  • Používá poskytnutý dvousloupcový částečný index (index scan using index_cars_onsale_on_brand_and_model_name ), takže odpovídá podmínce částečného indexu. Můžete to vidět v Filter: has_auto_gear . Zobrazí se také podmínka vyhledávání v indexu.

  • Výkon dotazu vypadá přiměřeně vzhledem k tomu, že počet řádků tabulky bude znamenat, že index je poměrně velký, zvláště když má více než dva sloupce. Odpovídající řádky budou roztroušené, takže je pravděpodobné, že každý řádek bude také vyžadovat čtení samostatné stránky.

Nevidím zde nic špatného. Tento dotaz však bude pravděpodobně velmi těžit z indexových skenů PostgreSQL 9.2.

Je možné, že zde dochází k nafouknutí tabulky, ale vzhledem k indexu se 2 sloupci a samotnému počtu řádků není doba odezvy zcela nepřiměřená, zvláště u tabulky se 170 (!!) sloupci, do kterých se pravděpodobně vejde relativně málo n-tic. strana. Pokud si můžete dovolit nějaké prostoje, zkuste VACUUM FULL reorganizovat tabulku a znovu sestavit index. Tím bude tabulka na nějakou dobu výhradně uzamčena, zatímco ji znovu sestavuje. Pokud si nemůžete dovolit prostoje, podívejte se na pg_reorg a/nebo CREATE INDEX CONCURRENTLY a ALTER INDEX ... RENAME TO .

Můžete najít EXPLAIN (ANALYZE, BUFFERS, VERBOSE) někdy více informativní, protože může zobrazovat přístupy do vyrovnávací paměti atd.

Jednou z možností, která může tento dotaz urychlit (ačkoli riskuje, že poněkud zpomalí ostatní dotazy), je rozdělení tabulky podle brand a povolte constraint_exclusion . Viz rozdělení.



  1. jak vybrat pouze řádek s maximální sekvencí bez použití poddotazu?

  2. Uložená procedura pro získání stavu indexů ve všech databázích

  3. Jak nastavím časový limit skriptu SQL Server ze skriptu?

  4. postgresql sekvence nextval ve schématu