Tôi không quen thuộc với việc xem xét các kết quả GIẢI ĐÁP GIẢI THÍCH, tôi có một vấn đề lớn với các truy vấn của tôi quá chậm. Tôi đã cố gắng đọc về cách diễn giải kết quả từ một truy vấn giải thích, nhưng tôi vẫn không biết mình nên tìm kiếm điều gì, và điều gì có thể sai. Tôi có cảm giác rằng có một số ánh sáng đỏ lớn nhấp nháy ở đâu đó, tôi chỉ không nhìn thấy nó.Làm thế nào để hiểu một GIẢI PHÁP GIẢI THÍCH
Vì vậy, các truy vấn được khá đơn giản, nó trông như thế này:
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
Và kết quả như thế này:
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
Một nền chút: Tôi đang trên PostgreSQL 9.1.6, chạy trên cơ sở dữ liệu chuyên dụng của Herokus. DB của tôi có RAM 7,5Gb aprox, các bảng ô tô chứa 3,1M hàng và một 2,0 triệu aprox của các hàng có sales_state = 'onsale'. Bảng có 170 cột. Chỉ mục mà nó sử dụng trông giống như thế này:
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;
Bất cứ ai nhìn thấy một số vấn đề rõ ràng lớn?
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: 46301184
SELECT avg(pg_column_size(cars)) FROM cars limit 5000;
trung bình: 636,9732567210792995
KHÔNG THE LIMIT:
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
Hãy thử hút bụi - http://www.postgresql.org/docs/8.1/static/maintenance.html. Các kế hoạch truy vấn có vẻ hợp lý, nhưng thời gian chắc chắn không! –
Ngay trước khi tôi chạy truy vấn, tôi chạy một chân không đầy đủ và một phân tích là tốt ... Trang web của tôi là một công cụ tìm kiếm cho xe ô tô được sử dụng, do đó, thời gian là bởi đến nay không thể chấp nhận. Mục tiêu của tôi là giảm tổng thời gian xuống dưới 1 giây. Bạn có nghĩ rằng đó là tất cả có thể, hoặc tôi sẽ phải tìm một công nghệ khác với một cơ sở dữ liệu hợp lý? –
@NielsKristian Tôi nghĩ rằng một phần lớn của vấn đề có thể là "170 cột" một phần. Bàn lớn đến mức nào? 'SELECT pg_relation_size ('xe hơi'), pg_total_relation_size ('xe hơi');'. Ngoài ra 'SELECT pg_relation_size ('index_cars_onsale_on_brand_and_model_name');' để có được kích thước chỉ mục. Chiều rộng hàng trung bình là bao nhiêu? 'SELECT avg (pg_column_size (cars)) TỪ ô tô thử nghiệm giới hạn 5000; ' –