sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgresql - Frågan körs mycket snabbare med enable_nestloop=false. Varför gör inte planeraren rätt?

Om frågeplaneraren väljer suboptimala frågeplaner är chansen stor att den har ofullständig eller vilseledande information att arbeta med.

Se denna PostgreSQL Wiki-sida på serverjustering. Var särskilt uppmärksam på kapitlen om random_page_cost och default_statistics_target .
Läs även motsvarande kapitel i manualen om Statistik Används av planeraren och Planerkostnadskonstanter .

Mer specifikt kan det hjälpa att öka statistics target för följande kolumner:

ALTER TABLE postgres.products ALTER COLUMN id SET STATISTICS 1000;
ALTER TABLE postgres.sales_orders ALTER COLUMN retailer_id SET STATISTICS 1000;
ALTER TABLE postgres.sales_orders ALTER COLUMN company_id SET STATISTICS 1000;

ALTER TABLE goods_return_notes ALTER COLUMN retailer_id SET STATISTICS 1000;
ALTER TABLE goods_return_notes ALTER COLUMN company_id SET STATISTICS 1000;

ALTER TABLE retailer_category_leaf_nodes ALTER COLUMN tree_left SET STATISTICS 1000;
ALTER TABLE channels ALTER COLUMN principal_id SET STATISTICS 1000;

Dessa är involverade i filtren som resulterar i

Det finns fler . Kontrollera varje kolumn där hyveln avviker mycket från uppskattningen. Standard är bara 100. Det är bara meningsfullt för tabeller med>> 1000 rader. Experimentera med inställningen. Kör ANALYZE på tabellerna efteråt för att ändringarna ska träda i kraft.

Det kan också hjälpa att skapa ett partiellt indexpostgres(sales_orders.retailer_id) WHERE retailer_id IS NOT NULL (beroende på hur vanliga NULL-värden är).

En annan sak som kan hjälpa dig är att uppgradera till den senaste versionen 9.1. Det har skett ett antal betydande förbättringar på detta område.



  1. Hur man ändrar automatiskt inkrementvärde för MySQL / MariaDB-databasen

  2. Hämta en enda rad från Join Table

  3. ProxySQL:Alla Severalnines resurser

  4. Hur kan pg_column_size vara mindre än octet_length?