को समझने के लिए कैसे मैं एक्सप्लोर विश्लेषण परिणामों को देखने से बहुत परिचित नहीं हूं, मुझे अपने प्रश्नों के साथ बहुत धीमी समस्या है। मैंने एक व्याख्या प्रश्नों के परिणामों की व्याख्या करने के तरीके को पढ़ने की कोशिश की है, लेकिन मुझे अभी भी पता नहीं है कि मुझे क्या देखना चाहिए, और क्या गलत हो सकता है। मुझे एहसास है कि कहीं भी कुछ बड़ी लाल रोशनी चमकती है, मुझे बस यह नहीं दिख रहा है।एक 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 पर हूँ, हेरोोकस समर्पित डेटाबेस पर चल रहा है। मेरे डीबी में लगभग 7,5 जीबी रैम है, टेबल कारों में 3,1 एम पंक्तियां हैं और पंक्तियों के एक 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;
कोई भी कुछ स्पष्ट स्पष्ट मुद्दा देख रहा है?
संपादित करें:
SELECT pg_relation_size('cars'), pg_total_relation_size('cars');
pg_relation_size: +२०५८४४४८०० 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
सफाई का प्रयास करें - http://www.postgresql.org/docs/8.1/static/maintenance.html। क्वेरी योजना उचित दिखती है, लेकिन समय निश्चित रूप से नहीं करता है! –
प्रश्न पूछने से ठीक पहले, मैंने एक पूर्ण वैक्यूम और एक विश्लेषण भी चलाया ... मेरी वेबसाइट प्रयुक्त कारों के लिए एक खोज इंजन है, इसलिए समय बहुत अस्वीकार्य है। मेरा लक्ष्य कुल समय को 1 सेकंड से कम तक प्राप्त करना है। क्या आपको लगता है कि यह संभव है, या मुझे एक तर्कसंगत डेटाबेस की तुलना में एक अलग तकनीक की तलाश करनी होगी? –
@ नील्स क्रिस्टियन मुझे लगता है कि समस्या का एक बड़ा हिस्सा "170 कॉलम" भाग हो सकता है। टेबल कितनी बड़ी है? 'चुनें pg_relation_size (' कार '), pg_total_relation_size (' कार '); '। इसके अलावा 'सूचकांक आकार प्राप्त करने के लिए' pg_relation_size ('index_cars_onsale_on_brand_and_model_name') चुनें; औसत पंक्ति चौड़ाई क्या है? 'चयन करें औसत (pg_column_size (कारें)) परीक्षण कारों से 5000 की सीमा; ' –