Я не очень хорошо знаком с результатами EXPLAIN ANALYZE, у меня огромная проблема с тем, что мои запросы слишком медленные. Я попытался прочитать о том, как интерпретировать результаты запросов объяснения, но я до сих пор не знаю, что мне следует искать и что может быть не так. У меня такое ощущение, что где-то мигает какой-то большой красный свет, просто я его не вижу.
Итак, запрос довольно прост, он выглядит так:
EXPLAIN ANALYZE SELECT "cars".* FROM "cars" WHERE "cars"."sales_state" = 'onsale' AND "cars"."brand" = 'BMW' AND "cars"."model_name" = '318i' AND "cars"."has_auto_gear" = TRUE LIMIT 25 OFFSET 0
И результат такой:
Limit (cost=0.00..161.07 rows=25 width=1245) (actual time=35.232..38.694 rows=25 loops=1)
-> Index Scan using index_cars_onsale_on_brand_and_model_name on cars (cost=0.00..1179.06 rows=183 width=1245) (actual time=35.228..38.652 rows=25 loops=1)
Index Cond: (((brand)::text = 'BMW'::text) AND ((model_name)::text = '318i'::text))
Filter: has_auto_gear"
Total runtime: 38.845 ms
Немного предыстории: я использую Postgresql 9.1.6, работаю на выделенных базах данных Herokus. Моя БД имеет около 7,5 ГБ ОЗУ, таблица cars содержит 3,1 млн строк, а примерно 2,0 млн строк имеют sales_state = 'onsale'. В таблице 170 столбцов. Индекс, который он использует, выглядит примерно так:
CREATE INDEX index_cars_onsale_on_brand_and_model_name
ON cars
USING btree
(brand COLLATE pg_catalog."default" , model_name COLLATE pg_catalog."default" )
WHERE sales_state::text = 'onsale'::text;
Кто-нибудь видит какую-то большую очевидную проблему?
РЕДАКТИРОВАТЬ:
SELECT pg_relation_size('cars'), pg_total_relation_size('cars');
pg_relation_size: 2058444800 pg_total_relation_size: 4900126720
SELECT pg_relation_size('index_cars_onsale_on_brand_and_model_name');
pg_relation_size: 46301184
SELECT avg(pg_column_size(cars)) FROM cars limit 5000;
среднее: 636,9732567210792995
БЕЗ ОГРАНИЧЕНИЙ:
EXPLAIN ANALYZE SELECT "cars".* FROM "cars" WHERE "cars"."sales_state" = 'onsale' AND "cars"."brand" = 'BMW' AND "cars"."model_name" = '318i' AND "cars"."has_auto_gear" = TRUE
Bitmap Heap Scan on cars (cost=12.54..1156.95 rows=183 width=4) (actual time=17.067..55.198 rows=2096 loops=1)
Recheck Cond: (((brand)::text = 'BMW'::text) AND ((model_name)::text = '318i'::text) AND ((sales_state)::text = 'onsale'::text))
Filter: has_auto_gear
-> Bitmap Index Scan on index_cars_onsale_on_brand_and_model_name (cost=0.00..12.54 rows=585 width=0) (actual time=15.211..15.211 rows=7411 loops=1)"
Index Cond: (((brand)::text = 'BMW'::text) AND ((model_name)::text = '318i'::text))
Total runtime: 56.851 ms
SELECT pg_relation_size('cars'), pg_total_relation_size('cars');
. ТакжеSELECT pg_relation_size('index_cars_onsale_on_brand_and_model_name');
для получения размера индекса. Какова средняя ширина ряда?SELECT avg(pg_column_size(cars)) FROM test cars limit 5000;
- person Craig Ringer   schedule 16.10.2012has_auto_gear
. То же самое, но быстрее для этой цели. - person Craig Ringer   schedule 16.10.2012