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

Postgresql - La query viene eseguita molto più velocemente con enable_nesloop=false. Perché il pianificatore non sta facendo la cosa giusta?

Se il pianificatore di query sceglie piani di query non ottimali, è probabile che disponga di informazioni incomplete o fuorvianti con cui lavorare.

Vedi questa pagina Wiki di PostgreSQL sull'ottimizzazione del server. Presta particolare attenzione ai capitoli su random_page_cost e obiettivo_statistico_predefinito .
Leggi anche i capitoli corrispondenti nel manuale su Statistiche Utilizzato dal pianificatore e Costanti del pianificatore .

Più specificamente, potrebbe aiutare ad aumentare il statistics target per le seguenti colonne:

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;

Questi sono coinvolti nei filtri risultanti nel

Ce ne sono di più . Controllare ogni colonna in cui la pialla si discosta molto dal preventivo. Il valore predefinito è solo 100. Ha senso solo per le tabelle con>> 1000 righe. Sperimenta con l'impostazione. Esegui ANALYZE successivamente sui tavoli affinché le modifiche abbiano effetto.

Potrebbe anche essere utile creare un indice parziale su postgres(sales_orders.retailer_id) WHERE retailer_id IS NOT NULL (a seconda di quanto sono comuni i valori NULL).

Un'altra cosa che potrebbe aiutarti è aggiornare all'ultima versione 9.1. Sono stati apportati numerosi miglioramenti sostanziali in questo settore.