एक SQL चयन के दौरान, DB हमेशा तालिका के लिए मेटाडेटा को संदर्भित करने जा रहा है, चाहे वह किसी भी, SEL, a, b, c के लिए सेलेक्ट * हो ... क्यों? बिकूज़ वह जगह है जहाँ सिस्टम पर तालिका की संरचना और लेआउट की जानकारी होती है।
इस जानकारी को दो कारणों से पढ़ना होगा। एक, केवल बयान संकलित करने के लिए। यह सुनिश्चित करने की आवश्यकता है कि आप किसी मौजूदा तालिका को बहुत कम से कम निर्दिष्ट करें। साथ ही, पिछली बार स्टेटमेंट निष्पादित होने के बाद डेटाबेस स्ट्रक्चर बदल गया होगा।
अब, जाहिर है, डीबी मेटाडेटा सिस्टम में कैश किया गया है, लेकिन यह अभी भी प्रसंस्करण है जिसे करने की आवश्यकता है।
इसके बाद, मेटाडेटा का उपयोग क्वेरी प्लान बनाने के लिए किया जाता है। ऐसा तब होता है जब हर बार एक बयान भी संकलित किया जाता है। फिर, यह कैश्ड मेटाडेटा के खिलाफ चलता है, लेकिन यह हमेशा किया जाता है।
केवल यही प्रक्रिया नहीं की जाती है जब DB एक पूर्व संकलित क्वेरी का उपयोग कर रहा है, या पिछली क्वेरी को कैश कर दिया है। यह शाब्दिक एसक्यूएल के बजाय बाध्यकारी मापदंडों का उपयोग करने का तर्क है। "" जहां से कुंजी = 1 "का चयन करें" से अलग है? और "1" कॉल पर बाध्य है।
DBs वहाँ काम के लिए पेज कैशिंग पर बहुत भरोसा करते हैं। कई आधुनिक DBs पूरी तरह से मेमोरी में फिट होने के लिए पर्याप्त हैं (या, शायद मुझे कहना चाहिए, आधुनिक मेमोरी कई DBs फिट करने के लिए काफी बड़ी है)। फिर पिछले छोर पर आपकी प्राथमिक I / O लागत लॉगिंग और पेज फ्लश है।
हालाँकि, यदि आप अभी भी अपने DB के लिए डिस्क को मार रहे हैं, तो कई प्रणालियों द्वारा किया गया एक प्राथमिक ऑप्टिमाइज़ेशन, तालिकाओं में डेटा पर भरोसा करने के लिए है, न कि तालिकाओं के बजाय।
यदि आपके पास है:
CREATE TABLE customer (
id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(150) NOT NULL,
city VARCHAR(30),
state VARCHAR(30),
zip VARCHAR(10));
CREATE INDEX k1_customer ON customer(id, name);
फिर यदि आप "SELECT id, नाम फ्रॉम कस्टमर व्हेयर आईडी = 1" करते हैं, तो यह बहुत संभव है कि आप डीबी को टेबल्स के बजाय इंडेक्स से इस डेटा को खींचेंगे।
क्यों? यह क्वेरी (बनाम एक टेबल स्कैन) को संतुष्ट करने के लिए किसी भी तरह सूचकांक का उपयोग करने की संभावना रखेगा, और जहां खंड में 'नाम' का उपयोग नहीं किया गया है, फिर भी वह सूचकांक क्वेरी के लिए सबसे अच्छा विकल्प होगा।
अब डेटाबेस में क्वेरी को संतुष्ट करने के लिए आवश्यक सभी डेटा हैं, इसलिए टेबल पेज को स्वयं हिट करने का कोई कारण नहीं है। जब आप सामान्य रूप से तालिका में अनुक्रमणिका में पंक्तियों का उच्च घनत्व रखते हैं, तो अनुक्रमणिका परिणाम कम डिस्क ट्रैफ़िक का उपयोग करता है।
यह कुछ डेटाबेस द्वारा उपयोग की जाने वाली एक विशिष्ट अनुकूलन तकनीक का एक हाथ लहराता है। कई में कई अनुकूलन और ट्यूनिंग तकनीक हैं।
अंत में, SELECT * को आपके द्वारा टाइप किए जाने वाले डायनामिक प्रश्नों के लिए उपयोगी है, मैं इसे कभी भी "वास्तविक कोड" के लिए उपयोग नहीं करूंगा। व्यक्तिगत कॉलम की पहचान डीबी को अधिक जानकारी देती है जिसका उपयोग वह क्वेरी को अनुकूलित करने के लिए कर सकता है, और आपको अपने कोड में स्कीमा परिवर्तन आदि के बारे में बेहतर नियंत्रण देता है।
SELECTप्रश्नों को कैसे निष्पादित / संसाधित किया जाता है, डेटाबेस से डेटाबेस में भिन्न होता है।