2012-01-02 19 views
6

क्या टेबल के बीच अंतर को स्कैन और सूचकांक एसक्यूएल में स्कैन और जहां यह विशेष रूप से इस्तेमाल किया जाता है?तालिका स्कैन और सूचकांक स्कैन एसक्यूएल में

+0

संभावित डुप्लिकेट [तालिका स्कैन और क्लस्टर्ड इंडेक्स स्कैन के बीच क्या अंतर है?] (Http://stackoverflow.com/questions/18764/whats-the-difference-between-a-table-scan-and- एक क्लस्टर-इंडेक्स-स्कैन) – gbn

+1

एक स्कैन टेबल पंक्तियों, अन्य इंडेक्स पंक्तियों को स्कैन करता है। आप आरडीबीएमएस क्या उपयोग कर रहे हैं? –

उत्तर

11

तालिका स्कैन सभी तालिका पंक्तियों पर पुनरावृति का मतलब है।

सूचकांक स्कैन सभी इंडेक्स आइटम, जब आइटम सूचकांक खोज शर्त पूरी करता है तालिका पंक्ति के सूचकांक के माध्यम से retrived है पर पुनरावृति का मतलब है। क्योंकि सूचकांक एक मेज की तुलना में अधिक फ्लैट है

आमतौर पर सूचकांक स्कैन एक मेज स्कैन की तुलना में कम खर्चीला है।

वे इस मुद्दे के बारे bibliografy की बहुत हैं। नमूना:

सूचकांक पहुँच एक्सेस तरीका है जिसमें एसक्यूएल सर्वर एक मौजूदा सूचकांक का उपयोग करता है पढ़ सकते हैं और डेटा पृष्ठ लिखने की है। चूंकि इंडेक्स एक्सेस महत्वपूर्ण रूप से I/O पढ़ने के संचालन की संख्या को कम करता है, यह अक्सर तालिका स्कैन से बेहतर प्रदर्शन करता है।

इस विधि में, एक पंक्ति सूचकांक traversing, बयान द्वारा निर्दिष्ट अनुक्रमित स्तंभ मान का उपयोग करके लिया गया है। एक इंडेक्स स्कैन इंडेक्स में एक या अधिक कॉलम के मान के आधार पर किसी इंडेक्स से डेटा पुनर्प्राप्त करता है। इंडेक्स स्कैन करने के लिए, ओरेकल के लिए इंडेक्स की खोज करता है जो कथन द्वारा एक्सेस किए गए अनुक्रमित कॉलम मानों को खोजता है। बयान सूचकांक का केवल कॉलम तक पहुँचता है, तो ओरेकल अनुक्रमित स्तंभ मान सीधे सूचकांक से, बल्कि मेज से की तुलना में पढ़ता है।

10

अधिकांश क्वेरी इंजन एक प्रश्न अनुकूलक, एक प्रभावी क्वेरी निष्पादन रणनीति उत्पन्न करने के लिए कोशिश करता है जो की है। यदि अनुक्रमणिका उपलब्ध हैं, जो क्वेरी को तेज़ी से बना सकती हैं, तो क्वेरी ऑप्टिमाइज़र एक इंडेक्स स्कैन या इंडेक्स खोज करेगा, अन्यथा एक टेबल स्कैन करेगा।

उदाहरण:

SELECT * FROM tbl WHERE category_id = 5; 

अगर वहाँ category_id पर कोई सूचकांक तो एक मेज स्कैन प्रदर्शन किया जाएगा, यानी जो तालिका में हर रिकॉर्ड सही category_id के लिए निरीक्षण किया जाएगा।

यदि, हालांकि, श्रेणी_आईडी अनुक्रमित है तो चीजें अधिक जटिल हो जाती हैं। यदि तालिका बहुत बड़ी है, तो इंडेक्स की तलाश शायद चुना जाएगा। हालांकि, यदि तालिका छोटा है, तो ऑप्टिमाइज़र यह तय कर सकता है कि एक टेबल स्कैन अभी भी तेज़ है, क्योंकि कुछ ओवरहेड को इंडेक्स तक पहुंचने की आवश्यकता होती है। यदि श्रेणी_आईडी पर्याप्त चुनिंदा नहीं है, उदाहरण के लिए यदि केवल दो श्रेणियां हैं, तो तालिका को स्कैन करना बड़ी तालिकाओं के लिए भी तेज हो सकता है।

इंडेक्स आमतौर पर वृक्ष संरचनाओं के रूप में व्यवस्थित होते हैं। एक पेड़ में एक वस्तु ढूँढना एक ओ (लॉग एन) ऑपरेशन है।एक टेबल स्कैन एक ओ (एन) ऑपरेशन है। गति मुख्य रूप से क्वेरी निष्पादित करने के लिए आवश्यक डिस्क एक्सेस की संख्या द्वारा निर्धारित की जाती है। पहले इंडेक्स की तलाश करना और फिर पाए गए प्रविष्टियों के लिए तालिका तक पहुंचने से छोटी टेबल के लिए अधिक डिस्क एक्सेस उत्पन्न हो सकती है।

हमें किसी अन्य क्वेरी पर एक नजर है:

SELECT category_id FROM tbl WHERE category_id BETWEEN 10 AND 100; 

यहाँ वहाँ एक और विकल्प उपलब्ध है। इस स्थिति में एक टेबल स्कैन की तुलना में एक इंडेक्स की तलाश तेज नहीं हो सकती है, लेकिन, क्योंकि हम केवल catergory_id के इंडेक्स स्कैन को पुनर्प्राप्त कर रहे हैं (इंडेक्स की तलाश नहीं) शायद तेज हो सकती है। एक इंडेक्स स्कैन पेड़ संरचना का लाभ लेने के बजाय इंडेक्स टेबल की प्रत्येक प्रविष्टि को पढ़ता है (इंडेक्स क्या चाहता है)। हालांकि, चूंकि अनुरोधित जानकारी इंडेक्स में पूरी तरह से निहित है, इसलिए डेटा तालिका तक पहुंच की आवश्यकता नहीं होगी। इंडेक्स स्कैन, तालिका की तरह ओ (एन) ऑपरेशन स्कैन करता है, लेकिन चूंकि सूचकांक आमतौर पर तालिका से छोटा होता है, इसलिए तालिका को स्कैन करने के बजाय इंडेक्स को स्कैन करने के लिए कम डिस्क एक्सेस की आवश्यकता होती है।

पूरा मामला बहुत जटिल है और डेटाबेस इंजन पर बहुत अधिक निर्भर करता है। यदि आप और जानना चाहते हैं, तो डीबी विक्रेता द्वारा प्रदान किए गए दस्तावेज को पढ़ें।

+1

यह आपके उदाहरण में इंडेक्स स्कैन नहीं होने पर एक इंडेक्स खोज (संभावित रूप से रेंज खोज) का उपयोग करेगा। इंडेक्स को कवर करने पर सूचकांक स्कैन की उम्मीद होगी, लेकिन एक उपयोगी अग्रणी कॉलम पर नहीं था या भविष्यवाणी चुनिंदा थी और तालिका की तुलना में सूचकांक संकुचित था। –

+1

ठीक है, मैंने इंडेक्स स्कैन और इंडेक्स खोज के बीच अंतर को ध्यान में रखते हुए, मेरा जवाब सही किया। –

2

जैसा कि @danihp ने प्रश्न के पहले भाग का जवाब दिया है, मैं दूसरे का उत्तर देने का प्रयास करूंगा "यह विशेष रूप से कहां उपयोग किया जाता है"। यह ओरेकल के लिए है लेकिन अधिकांश आरडीबीएमएस के लिए यह सच है।

मान लेते हैं हम स्तंभ yet_another_column पर एक टेबल my_table है, जो एक स्तंभ id पर विशिष्ट अनुक्रमित और एक दूसरे सूचकांक, जो गैर अद्वितीय है है है, करते हैं:, अब

create my_table (id varchar2(20) not null 
       , another_column not null 
       , yet_another_column 
       , constraint pk_my_table primary key (id) 
       ); 

create index i_my_table on my_table (yet_another_column); 

अगर हम के लिए गए थे select * from my_table where id = '1' यह सूचकांक के अद्वितीय सूचकांक स्कैन/करना चाहिए। फिर हम my_table में id = '1' में सबकुछ वापस करने के लिए, इंडेक्स का उपयोग करके टेबल को फिर से दर्ज करें।

यदि क्वेरी select id from my_table where id = 'a' थी, तो दूसरी चरण की आवश्यकता नहीं है क्योंकि हमें आवश्यक सभी मान इंडेक्स के भीतर निहित हैं। इस मामले में क्वेरी पूरी तरह से अद्वितीय इंडेक्स स्कैन करेगा।

इसके बाद, यदि हमारे क्वेरी गया select * from my_table where yet_another_column = 'y' तो हम एक सूचकांक स्तंभ पर है, लेकिन यह अद्वितीय तो हम सभी मूल्यों है कि हमारे जहां हालत से मेल खाते हैं खोजने की कोशिश करने के लिए पूरे सूचकांक के माध्यम से देखने के लिए करने जा रहे हैं नहीं है , यानी इंडेक्स स्कैन। एक बार फिर हम उन स्तंभों का चयन कर रहे हैं जो हमारे सूचकांक में नहीं हैं इसलिए हमें उन्हें प्राप्त करने के लिए तालिका में फिर से प्रवेश करना होगा।

आखिरकार, अगर हमारी क्वेरी select id from my_table where another_column = 'yes' थी। हमारे पास another_column पर कोई अनुक्रमणिका नहीं है इसलिए हमें मूल्य खोजने के लिए तालिका स्कैन करना है, यानी हमें तालिका where another_column = 'yes' तालिका में सब कुछ मिलना है।

अब, इन उदाहरणों में तालिका स्कैन और इंडेक्स स्कैन के बीच कोई अंतर नहीं लग सकता है। हमें अभी भी डेटाबेस में किसी ऑब्जेक्ट में एक मूल्य जाना है और ढूंढना है। हालांकि, चूंकि इंडेक्स बहुत छोटा है और विशेष रूप से स्कैन किए जाने के लिए डिज़ाइन किया गया है (अन्य उत्तरों देखें) आमतौर पर इंडेक्स स्कैन करने के लिए बहुत तेज है यदि आप केवल तालिका में पंक्तियों का एक छोटा सा हिस्सा चाहते हैं। यदि आप तालिका का 10% कहना चाहते हैं तो यह बिंदु "यह निर्भर करता है" बन जाता है।

+0

क्या ओरेकल खोज और स्कैन के बीच अंतर नहीं करता है? –

+1

@ मार्टिनस्मिथ, मैंने कभी उन्हें "तलाश" के रूप में वर्णित/देखा नहीं है, लेकिन मैं आपका बिंदु देखता हूं। मैंने एक गैर-पीके उदाहरण शामिल करने के लिए अपना जवाब संपादित कर लिया है। मुझे लगता है कि अद्वितीय सूचकांक 'तलाश' और गैर-अनूठा 'स्कैन' होगा। – Ben

2

एसक्यूएल सर्वर के लिए कम से कम:

एक सूचकांक स्कैन, क्योंकि, शायद, सूचकांक तालिका में कॉलम के पूरे सेट को कवर नहीं करता तेजी से किया जा सकता है, जबकि एक मेज (या संकुल इंडेक्स) स्कैन करने के लिए है सभी डेटा पढ़ें। यदि किसी इंडेक्स में तालिका में सभी कॉलम शामिल होते हैं, तो यह लगभग तालिका स्कैन के बराबर होना चाहिए, और इंडेक्स स्कैन और टेबल (या सीआईक्स) स्कैन के बीच की पसंद सिक्का टॉस होगी। अंतर यह है कि जब आपके पास इंडेक्स में कम कॉलम होते हैं, तो आप 8kb पेज पर अधिक इंडेक्स पंक्तियों को फिट कर सकते हैं, जिससे इंडेक्स में सभी डेटा स्कैन करने के लिए आपको कम समग्र पृष्ठ पढ़ना पड़ता है।

मेरा मतलब यह समझाने के लिए कि क्या आपके पास फोन बुक की दो प्रतियां हैं, एक अंतिम नाम, पहला नाम, सड़क का पता, और फोन नंबर, और केवल अंतिम नाम, पहला नाम और फोन नंबर वाला एक है। अब कल्पना करें कि सड़क के पते को मुद्रित करने की आवश्यकता नहीं है, इसलिए आप फोन बुक में किसी भी पेज पर नामों और फोन नंबरों के दो अतिरिक्त कॉलम फिट कर सकते हैं। इसका अंतिम परिणाम यह है कि फोन बुक पतली है, क्योंकि आप कम पृष्ठों पर फोन नंबरों की संख्या को फिट कर सकते हैं। इसके बाद, कल्पना करें कि आप पुस्तक में फोन नंबरों की संख्या गिनने के आरोप में हैं। आप कौन सी चुनते हैं, जिसने सड़क के पते के साथ सूचीबद्ध किया है (जिसमें अधिक पेज हैं, एक टेबल स्कैन के समान हैं) या सड़क के पते के बिना कोई (जिसमें कम पृष्ठ हैं, अधिकांश इंडेक्स स्कैन के समान हैं)? मैं कम पृष्ठों वाले एक को चुनूंगा।

इसमें एक और झुर्रियां यह है कि कुछ इंडेक्स फ़िल्टर किए जा सकते हैं, जिसका अर्थ है कि न केवल अधिकांश मामलों में उनके पास कम कॉलम होते हैं (और इसलिए एक पंक्ति पर अधिक पंक्तियां फिट कर सकते हैं), लेकिन उनके पास एक WHERE क्लॉज भी हो सकता है बहुत सारी पंक्तियों को समाप्त करता है। इस मामले में, साथ ही, एक इंडेक्स स्कैन एक टेबल स्कैन से बेहतर होगा (लेकिन यह केवल उन प्रश्नों के लिए काम करेगा जिनके पास मेलिंग क्लॉज और समान अर्थशास्त्र है)।

संबंधित मुद्दे