EXPLAIN ANALYZE 결과를 보는 데 익숙하지 않아 쿼리가 너무 느려서 큰 문제가 있습니다. 내가 설명 쿼리의 결과를 해석하는 방법을 읽으려고했지만, 내가 무엇을 찾고 있어야하는지, 그리고 무엇이 잘못 될지 모릅니다. 어딘가에 큰 빨간 불빛이 깜박 거리고 있다는 느낌이 들었습니다.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에있어, Herokuus 전용 데이터베이스에서 실행됩니다. 내 DB는 aprox 7,5Gb RAM을 가지고 있으며, 테이블 카는 3,1M 행을 포함하고 행의 aprox 2,0M에는 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;
사람 :이 사용하는 인덱스는 다음과 같이 보인다?
EDIT :
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 : 46,301,184
SELECT avg(pg_column_size(cars)) FROM cars limit 5000;
평균 : 636.9732567210792995
제한없이 17,451,515,:
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
는 진공 청소기로 청소하십시오 - http://www.postgresql.org/docs/8.1/static/maintenance.html. 쿼리 계획은 합리적인 것처럼 보이지만 시간은 분명 없습니다! –
검색어를 실행하기 바로 전에 전체 진공도와 분석도 실행했습니다 ... 내 웹 사이트는 중고차의 검색 엔진이므로 타이밍이 훨씬 용납되지 않습니다. 내 목표는 총 시간을 1 초 미만으로 줄이는 것입니다. 그것이 가능하다고 생각하십니까? 아니면 합리적인 데이터베이스가 아닌 다른 기술을 찾아야합니까? –
@NielsKristian 나는이 문제의 큰 부분이 "170 열"부분일지도 모른다고 생각한다. 테이블이 얼마나 큽니까? '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 테스트 자동차 한도가 5000; ' –