क्या मुझे विशिष्ट मल्टी कॉलम इंडेक्स के बजाय कई सिंगल फील्ड इंडेक्स का उपयोग करना चाहिए?


35

यह प्रश्न SQL सर्वर इंडेक्सिंग तकनीक की प्रभावशीलता के बारे में है। मुझे लगता है कि इसे "इंडेक्स चौराहा" के रूप में जाना जाता है।

मैं एक मौजूदा SQL सर्वर (2008) एप्लिकेशन के साथ काम कर रहा हूं जिसमें कई प्रदर्शन और स्थिरता के मुद्दे हैं। डेवलपर्स ने इंडेक्सिंग के साथ कुछ अजीब चीजें कीं। मैं इन मुद्दों पर निर्णायक बेंचमार्क प्राप्त करने में सक्षम नहीं हूं, और न ही मैं इंटर्नेट्स पर कोई बहुत अच्छा प्रलेखन पा सकता हूं।

एक मेज पर कई खोज योग्य स्तंभ हैं। डेवलपर्स ने खोजा स्तंभों में से एक पर एक एकल स्तंभ सूचकांक बनाया। सिद्धांत यह था कि एसक्यूएल सर्वर इन परिस्थितियों में से प्रत्येक को कुशलतापूर्वक अधिकांश परिस्थितियों में तालिका तक पहुंचने के लिए (प्रतिच्छेद) संयोजित कर सकता है। यहाँ एक सरल उदाहरण है (वास्तविक तालिका में अधिक क्षेत्र हैं):

CREATE TABLE [dbo].[FatTable](
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [col1] [nchar](12) NOT NULL,
    [col2] [int] NOT NULL,
    [col3] [varchar](2000) NOT NULL, ...

CREATE NONCLUSTERED INDEX [IndexCol1] ON [dbo].[FatTable]  ( [col1] ASC )
CREATE NONCLUSTERED INDEX [IndexCol2] ON [dbo].[FatTable] ( [col2] ASC )

select * from fattable where col1 = '2004IN' 
select * from fattable where col1 = '2004IN' and col2 = 4

मुझे लगता है कि खोज मापदंड के लिए लक्षित कई कॉलम इंडेक्स बहुत बेहतर हैं, लेकिन मैं गलत हो सकता हूं। मैंने क्वेरी योजनाओं को देखा है जो एसक्यूएल सर्वर को दो अनुक्रमांक पर हैश मैच करते हुए दिखाते हैं। शायद यह तब समझ में आता है जब आपको पता नहीं होता है कि टेबल की खोज कैसे की जाती है? धन्यवाद।


@brentozar इंडेक्स के बारे में एक अच्छा वीडियो है जो देखने लायक है: brentozar.com/sql-server-training-videos/…
DForck42

जवाबों:


38

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

हालाँकि आप अंगूठे के कुछ नियम लागू कर सकते हैं। MSDN मूल बातें काफी अच्छी तरह से कवर करता है:

समुदाय द्वारा योगदान किए गए लेखों के असंख्य भी हैं, उदाहरण के लिए। वेबकास्ट रिकॉर्डिंग - डीबीए डार्विन पुरस्कार: इंडेक्स संस्करण

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


धन्यवाद रेमुस मैं लक्षित मल्टी कॉलम इंडेक्स (और शामिल) बनाने के सापेक्ष लाभ के बारे में सोच रहा हूं, बनाम अलग-अलग इंडेक्स का उपयोग करके। यदि यह "काफी अच्छी तरह से काम करता है" काफी अच्छा है, तो यह ठीक हो सकता है। (निम्न-चयन क्षेत्रों पर अनुक्रमणिका को बाहर फेंक देगा)। यह तकनीक तब मदद करनी चाहिए जब हमारे पास उत्पादन डेटाबेस तक पहुंच न हो, और वास्तविक उपयोग के लिए हमारे सूचकांक को लक्षित न कर सकें।
राउल रुबिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.