Ecco una query lenta su Postgres 9.1.6, anche se il numero massimo è 2, con entrambe le righe già individuati dai loro chiavi primarie: (4,5 secondi)Come posso impedire a Postgres di inlining di una subquery?
EXPLAIN ANALYZE SELECT COUNT(*) FROM tbl WHERE id IN ('6d48fc431d21', 'd9e659e756ad') AND data ? 'building_floorspace' AND data ?| ARRAY['elec_mean_monthly_use', 'gas_mean_monthly_use'];
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=4.09..4.09 rows=1 width=0) (actual time=4457.886..4457.887 rows=1 loops=1)
-> Index Scan using idx_tbl_on_data_gist on tbl (cost=0.00..4.09 rows=1 width=0) (actual time=4457.880..4457.880 rows=0 loops=1)
Index Cond: ((data ? 'building_floorspace'::text) AND (data ?| '{elec_mean_monthly_use,gas_mean_monthly_use}'::text[]))
Filter: ((id)::text = ANY ('{6d48fc431d21,d9e659e756ad}'::text[]))
Total runtime: 4457.948 ms
(5 rows)
Hmm, forse se faccio una subquery con solo la parte chiave primaria prima ...: (no, ancora 4.5+ secondi)
EXPLAIN ANALYZE SELECT COUNT(*) FROM ( SELECT * FROM tbl WHERE id IN ('6d48fc431d21', 'd9e659e756ad') ) AS t WHERE data ? 'building_floorspace' AND data ?| ARRAY['elec_mean_monthly_use', 'gas_mean_monthly_use'];
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=4.09..4.09 rows=1 width=0) (actual time=4854.170..4854.171 rows=1 loops=1)
-> Index Scan using idx_tbl_on_data_gist on tbl (cost=0.00..4.09 rows=1 width=0) (actual time=4854.165..4854.165 rows=0 loops=1)
Index Cond: ((data ? 'building_floorspace'::text) AND (data ?| '{elec_mean_monthly_use,gas_mean_monthly_use}'::text[]))
Filter: ((id)::text = ANY ('{6d48fc431d21,d9e659e756ad}'::text[]))
Total runtime: 4854.220 ms
(5 rows)
Come posso evitare che Postgres dalla inlining subquery?
Sfondo: Ho una tabella Postgres 9.1 utilizzando hstore e con un GiST index su di esso.
La stima dei costi sulla scansione dell'indice dei gist sembra essere abbastanza errata (a 4.09, è inferiore a quella dell'indice della chiave primaria). Potresti controllare se puoi fare qualcosa al riguardo, come garantire nuove statistiche e/o aumentare il [target delle statistiche] (http://www.postgresql.org/docs/9.1/static/runtime-config-query.html#GUC -default-Statistics-destinazione). –
Ho aumentato il target a 9999 e ho eseguito 'VACUUM ANALYZE' ... ... ottenendo sempre la stessa stima dei costi rispetto alla discrepanza della realtà. Grazie per il tuo suggerimento, però! –