नाम से सभी कॉलम (एक अलग कॉलम क्रम में) चुनने की तुलना में SELECT * बहुत तेज क्यों है?


12

कॉलम ए, बी, सी, डी, ई, एफ, जी, एच, आई, जे, के साथ एक मेज पर मुझे मिलता है:

select * from misty order by a limit 25;
Time: 302.068 ms

तथा:

select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25;
Time: 1258.451 ms

क्या कॉलम द्वारा चयन को तेज़ बनाने का कोई तरीका है?

अपडेट करें:

एक मेज पर कोई सूचकांक, नव निर्मित एक

यहाँ का विस्तार विश्लेषण है, बहुत उपयोगी नहीं लगता है:

explain analyze select * from misty order by a limit 25;

Limit  (cost=43994.40..43994.46 rows=25 width=190) (actual time=404.958..404.971 rows=25 loops=1)
->  Sort  (cost=43994.40..45731.11 rows=694686 width=190) (actual time=404.957..404.963 rows=25 loops=1)
     Sort Key: a
     Sort Method: top-N heapsort  Memory: 28kB
     ->  Seq Scan on misty  (cost=0.00..24390.86 rows=694686 width=190) (actual time=0.013..170.945 rows=694686 loops=1)
Total runtime: 405.019 ms
(6 rows)

तथा:

explain analyze select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25;

Limit  (cost=43994.40..43994.46 rows=25 width=190) (actual time=1371.735..1371.745 rows=25 loops=1)
->  Sort  (cost=43994.40..45731.11 rows=694686 width=190) (actual time=1371.733..1371.736 rows=25 loops=1)
     Sort Key: a
     Sort Method: top-N heapsort  Memory: 28kB
     ->  Seq Scan on misty  (cost=0.00..24390.86 rows=694686 width=190) (actual time=0.015..516.355 rows=694686 loops=1)
Total runtime: 1371.797 ms
(6 rows)

स्तंभ एक अनुक्रमित है? क्या आप विश्लेषण की व्याख्या कर सकते हैं?
user_0

1
आपको एक पंक्ति में दो चयन करने और समय की तुलना करने में सावधानी बरतने की आवश्यकता है। दूसरी क्वेरी पर कैशे में डेटा समय के अंतर के लिए हो सकता है।
वाल्टर मिती

1
मैं मतभेद भी देख रहा हूं, हालांकि उच्चारण के रूप में नहीं। मेरी तालिका में पंक्तियाँ = 514431 चौड़ाई = 215 है, और मुझे select *केस के लिए लगभग 1.5 s और एक अलग क्रम में सूचीबद्ध कॉलम के साथ चयन के लिए लगभग 2.2 s मिलता है ।
कॉलिन टी हार्ट

यदि मैं तालिका में परिभाषित सभी स्तंभों को उसी क्रम में सूचीबद्ध करता हूं, तो मुझे लगभग उसी समय मिलता है जैसे कि मैं select *
कॉलिन टी हार्ट

2
शीर्षक भ्रामक है। वास्तव में सवाल यह है कि एक प्रकार की अवधि आउटपुट कॉलम के आदेश पर क्यों निर्भर करती है।
डैनियल वेत्रे

जवाबों:


12

यह मेलिंग सूची में pgsql- हैकर्स के लिए पोस्ट किया गया था और मैंने वहां संक्षेप में जवाब देने की कोशिश की । ऐसा लगता है कि यदि लक्ष्य सूची (निर्दिष्ट कॉलम) संबंध के ट्यूलल डिस्क्रिप्टर से बिल्कुल मेल खाती है, अर्थात, कॉलम और ऑर्डर की संख्या दोनों में, तो अंतर्निहित स्कैन एक टपल लौटा सकता है जो सीधे एनक्लोजर द्वारा घेरने वाले नोड द्वारा छांटे जा सकते हैं। दूसरी ओर, यदि लक्ष्य सूची मेल नहीं खाती है (या तो क्रम में या निर्दिष्ट कॉलमों की संख्या), स्कैन एक ऐसे ट्यूपल्स का रिटर्न देता है, जिन्हें अतिरिक्त कार्य करने के लिए सॉर्ट के डेटा तैयारी चरण की आवश्यकता होती है (आंतरिक टपल प्रारूप से कन्वर्ट करने के लिए) प्रारूप सीधे छँटाई कोड द्वारा उपभोज्य)।

वैसे, '*' आंतरिक रूप से एक सूची में बदल जाता है जो (सहज रूप से) संबंध के ट्यूल वर्णक से मेल खाती है।

संपादित करें: यदि आप अपने उत्तरार्द्ध उदाहरण ANALYZE के Seq स्कैन के वास्तविक समय को देखते हैं, तो आप देख सकते हैं कि यह पूर्व की तुलना में अधिक है। ऐसा इसलिए हुआ क्योंकि स्कैन ने प्रक्षेपण के एक अतिरिक्त चरण का प्रदर्शन किया (यानी, ढेर टपल को एक आंतरिक मूल्यों में परिवर्तित करना [], नल]] प्रारूप)। और ऐसा होने के कारण, ऊपरी सॉर्ट नोड को अपने डेटा इनिशियलाइज़ेशन में अतिरिक्त काम करना था, जो कि इसे वापस टपल प्रारूप में परिवर्तित करना था जो कि वास्तविक सॉर्टिंग चरण समझता है। यह सॉर्ट की स्टार्टअप लागत से स्पष्ट है। पूर्व के मामले में ऐसा नहीं होता है। यही है, दोनों स्कैन tuple के रूप में यह है और तरह के initialization कदम बस इसे कॉपी करता है।


@ Colin'tHart, आशा है कि समझ में आता है।
एमिटन

हाँ। मुझे उम्मीद है कि यह उस कदम को छोड़ना या कुछ "पॉइंटर फेरबदल" का उपयोग करके इसे कम करना संभव होगा, लेकिन यह pgsql-hackers के लिए एक चर्चा है।
कॉलिन टी हार्ट

तार्किक कॉलम ऑर्डरिंग कार्य के हालिया पुनरुद्धार के साथ क्षितिज पर कुछ सुधार हो सकते हैं ।
अमितलान

मैं पहले से ही उसके बारे में सोच रहा था और उम्मीद कर रहा था!
कॉलिन टी हार्ट

प्रिय महोदय, अगर मुझे केवल सभी के बजाय कुछ स्तंभों की आवश्यकता है, जो तेजी से होगा? * चुनें या some_of_columns चुनें? बहुत बहुत धन्यवाद।
sgon00
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.