सूचकांक बनने के बाद किस बिंदु पर कुशल होता है


9

मुझे बहुत सारे संसाधन मिले हैं जो उल्लेख करते हैं कि एक तालिका में एक सूचकांक जोड़ने से खोज तेज होती है और धीमी गति से सम्मिलित होती है, लेकिन केवल अगर तालिका बड़ी है। यह एक ट्रेडऑफ़ बनाता है, जो एक डिज़ाइन निर्णय है, लेकिन एक अनुमानित तालिका आकार होना चाहिए, जिसके पहले एक सूचकांक का उपयोग करना बेतुका है। (10 पंक्तियाँ, उदाहरण के लिए, शायद उस सीमा के नीचे रास्ता है)

क्या किसी को इस बारे में पता है कि यह सीमा कहां होगी, या किसी ऐसे संसाधन के बारे में जो मुझे सही दिशा में इंगित करेगा?


आपके आवेदन के लिए रीड / राइट अनुपात क्या है? यदि आप वास्तव में गहन लिखते हैं, तो शायद यह वह बिंदु है जहाँ आपको राइट्स ट्रेडऑफ पर विचार करने की आवश्यकता है, लेकिन अगर यह एक सामान्य अनुप्रयोग है, तो मैं 99% मामलों में आवश्यक सूचकांक जोड़ूंगा (तालिकाएं आमतौर पर बढ़ती हैं, वे शायद ही कभी। आकार में वापस जाओ)।
मैरियन

जवाबों:


12

समय से पहले निर्धारित करने के लिए सटीक सीमा वास्तव में कठिन है।

एक चीज जिसे ज्यादातर लोग कम आंकते हैं, वह उच्च आवश्यकताएं हैं जो एक सूचकांक को पूरा करना चाहिए, इससे पहले कि वह एक प्रश्न में उपयोग किए जाने वाले उम्मीदवार बन जाए।

एक कुशल (अस्पष्ट) सूचकांक

  • महान चयनात्मकता प्रदान करता है , उदाहरण के लिए कुल पंक्तियों का केवल एक बहुत छोटा प्रतिशत (<1%, <2%) देता है। यदि चयनात्मकता दी गई नहीं है - SQL सर्वर की क्वेरी ऑप्टिमाइज़र इस सूचकांक को अनदेखा कर देगा

  • आदर्श रूप से क्वेरी को कवर करना चाहिए , यानी क्वेरी के लिए आवश्यक सभी तह कॉलम वापस करना चाहिए । यदि आप एक इंडेक्स बना सकते हैं जिसमें 1 या 2 इंडेक्स कॉलम हैं, और इसमें शामिल स्तंभों के रूप में एक और मुट्ठी भर (2-4) कॉलम शामिल हैं और इस तरह आप एक क्वेरी कवर कर सकते हैं - तो संभावना है कि क्वेरी ऑप्टिमाइज़र इस इंडेक्स का उपयोग करेगा। जिसका अर्थ यह भी है: यदि आपका कोड हमेशा सभी कॉलमSELECT * ..... लाने के लिए उपयोग कर रहा है, तो उपयोग किए जाने वाले सूचकांकों की संभावना कम हो जाती है - वास्तव में

मुझे यकीन है कि अन्य मानदंडों का एक टन भी है - लेकिन मुझे विश्वास होगा कि ये दोनों सबसे महत्वपूर्ण हैं। बेशक, आपको हमेशा अपने सूचकांकों को ठीक से बनाए रखना चाहिए (पुनर्गठित करना, पुनर्निर्माण करना) और सुनिश्चित करें कि आपके सूचकांकों से जुड़े आँकड़े अद्यतित हैं।

पुनश्च: विदेशी प्रमुख स्तंभों पर गैर-सूचीबद्ध सूचकांक एक विशेष मामला है; डिफ़ॉल्ट रूप से, मैं हमेशा उन्हें जोड़ने की सलाह दूंगा, क्योंकि वे दोनों संदर्भात्मक अखंडता जांचों को गति देने में मदद करते हैं, साथ ही JOINउन एफके बाधाओं पर भी। लेकिन यहाँ भी, यह कुछ अतिरिक्त जोड़कर उन FK स्तंभ सूचकांकों को "विस्तारित" करने के लिए बिल्कुल वैध है "स्तंभों में उन्हें और भी अधिक उपयोगी बनाने के लिए।"


2
हालांकि यह उत्तर सीधे प्रश्न का उत्तर नहीं दे सकता है, यह सूचकांक के लिए महत्वपूर्ण डिजाइन सिद्धांत देकर बेहतर करता है, और उस प्रश्न का उत्तर देता है जो मुझे पहली बार में पूछना चाहिए था।
सीनवीडएच

6

आप केवल 10 पंक्तियों वाले सूचकांक से सुधार देख सकते हैं।

मेरी मशीन पर निम्नलिखित परीक्षण में 10.5सेकंड में एक सूचकांक के बिना संस्करण और सेकंड में एक सूचकांक के साथ संस्करण 9.8(लगातार 3 रन से अधिक)।

इस मामले में अनुक्रमणिका में केवल 1 पत्ती पृष्ठ होता है, लेकिन जैसा कि सूचकांक सरणी क्रम में स्लॉट सरणी का आदेश दिया गया है, यह उपस्थिति एसक्यूएल सर्वर को केवल सभी 10 पर एकत्रीकरण करने के बजाय ब्याज की एकल पंक्ति को वापस करने की अनुमति देता है।

CREATE TABLE T
(
X INT,
Y CHAR(100) NULL
)

INSERT INTO T (X)
SELECT number 
FROM master..spt_values
WHERE type='P' AND number BETWEEN 1 AND 10

set nocount on;

DECLARE @I INT, @X INT

DECLARE @Time DATETIME2(7) = SYSUTCDATETIME()

SET @I = 1
    WHILE (@I < 1000000)
    BEGIN
    SELECT @X = MAX(X)
    FROM T
    SET @I += 1
    END

SELECT DATEDIFF(MICROSECOND, @Time, SYSUTCDATETIME())

CREATE CLUSTERED INDEX IX ON T(X)
SET @Time = SYSUTCDATETIME()
SET @I = 1
    WHILE (@I < 1000000)
    BEGIN
    SELECT @X = MAX(X)
    FROM T
    SET @I += 1
    END

SELECT DATEDIFF(MICROSECOND, @Time, SYSUTCDATETIME())

DROP TABLE T

आवेषण समान रूप से प्रभावित होते हैं, या मंदी न्यूनतम है?
सीनवीडएच

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

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