Oto powolne kwerendy na PostgreSQL 9.1.6, choć maksymalna liczba wynosi 2, z obu rzędach już zidentyfikowanych przez swoich kluczy podstawowych: (4,5 sekundy)W jaki sposób można zapobiec wpisywaniu podkwerendy w PostgreSQL?
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, może gdybym zrobić podkwerenda z tylko podstawowym elementem kluczowym pierwszy ...: (Nie, nadal 4.5+ sekund)
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)
Jak mogę zapobiec Postgresa z inline podkwerendy?
Tło: Mam tabelę Postgres 9.1 z wykorzystaniem hstore i GiST index na jej temat.
Szacowanie kosztów skanowania głównego indeksu wydaje się być całkiem błędne (na 4,09, jest niższe niż dostęp do indeksu klucza podstawowego). Możesz sprawdzić, czy możesz coś z tym zrobić, na przykład zapewnić nowe statystyki i/lub zwiększyć [cel statystyk] (http://www.postgresql.org/docs/9.1/static/runtime-config-query.html#GUC -DEFAULT-STATISTICS-CEL). –
Zwiększyłem cel do 9999 i uruchomiłem "VACUUM ANALYZE" ... wciąż uzyskując ten sam kosztorys w porównaniu do rozbieżności w rzeczywistości. Dzięki za twoją sugestię! –