2010-10-22 12 views
5

आंकड़े (जो कि एक सूचकांक का उपयोग किया जाना है या नहीं, यह निर्धारित करने में मदद करें) वास्तविक कॉलम मान पंक्तियों की संख्या को ध्यान में रखें, या यह प्रति 0 पंक्तियों की संख्या औसत का उपयोग करता है।एसक्यूएल सांख्यिकी और सूचकांक - वे कितने विस्तृत हैं?

मान लीजिए मेरे पास सक्रिय नामक एक बिट कॉलम वाला एक टेबल है जिसमें लाखों पंक्तियां हैं, लेकिन 99.99% झूठी पर सेट है। अगर मेरे पास इस कॉलम पर एक इंडेक्स है, तो सक्रिय = 1 की खोज करते समय एसक्यूएल को इंडेक्स का उपयोग करने के लिए पर्याप्त समझदार है, लेकिन सक्रिय = 0 की खोज करने पर कोई बात नहीं है।

एक और उदाहरण, यदि मेरे पास एक सारणी है जिसमें एक अनुक्रमित कॉलम के साथ 1,000,000 रिकॉर्ड हैं, जिसमें 10 के मूल्य प्रति पंक्तियों की औसत संख्या के साथ लगभग 50,000 अलग-अलग मान हैं, लेकिन फिर एक विशेष मूल्य जिसमें 500,000 पंक्तियां हैं। इस विशेष रिकॉर्ड की खोज करते समय सूचकांक उपयोगी नहीं हो सकता है, लेकिन किसी भी अन्य कोड की तलाश करते समय बहुत उपयोगी होगा।

लेकिन क्या यह विशेष मामला इंडेक्स की प्रभावशीलता को बर्बाद कर देता है।

उत्तर

1

यह एक हिस्टोग्राम बनाता है और इस प्रकार इसका उपयोग करेगा।

एक सा स्तंभ यह एक अच्छा विचार है कि कितने 0 और 1

एक स्ट्रिंग स्तंभ के साथ

, यह iwll "बैंड" का मोटा अनुमान है होगा साथ

(मूल्य क, ख शुरू, ग आदि) । संख्याओं के लिए समान (यह मूल्य सीमाओं के एक्स बैंड बनाता है)।

बस देखें कि आपके प्रबंधन स्टूडियो में आंकड़े कैसे दिखते हैं - आप वास्तव में हिस्टोग्राम तक पहुंच सकते हैं।

3

आप अपने आप के लिए देख सकते हैं:

CREATE TABLE IndexTest (
Id int not null primary key identity(1,1), 
Active bit not null default(0), 
IndexedValue nvarchar(10) not null 
) 

CREATE INDEX IndexTestActive ON IndexTest (Active) 
CREATE INDEX IndexTestIndexedValue ON IndexTest (IndexedValue) 

DECLARE @values table 
(
    Id int primary key IDENTITY(1, 1), 
    Value nvarchar(10) 
) 

INSERT INTO @values(Value) VALUES ('1') 
INSERT INTO @values(Value) VALUES ('2') 
INSERT INTO @values(Value) VALUES ('3') 
INSERT INTO @values(Value) VALUES ('4') 
INSERT INTO @values(Value) VALUES ('5') 
INSERT INTO @values(Value) VALUES ('Many') 
INSERT INTO @values(Value) VALUES ('Many') 
INSERT INTO @values(Value) VALUES ('Many') 
INSERT INTO @values(Value) VALUES ('Many') 
INSERT INTO @values(Value) VALUES ('Many') 

DECLARE @rowCount int 
SET @rowCount = 100000 

WHILE(@rowCount > 0) 
BEGIN 
    DECLARE @valueIndex int 
    SET @valueIndex = CAST(RAND() * 10 + 1 as int) 
    DECLARE @selectedValue nvarchar(10) 
    SELECT @selectedValue = Value FROM @values WHERE Id = @valueIndex 
    DECLARE @isActive bit 
    SELECT @isActive = CASE 
      WHEN RAND() < 0.001 THEN 1 
      ELSE 0 
      END 
    INSERT INTO IndexTest(Active, IndexedValue) VALUES (@isActive, @selectedValue) 
    SET @rowCount = @rowCount - 1 
END 

SELECT count(*) FROM IndexTest WHERE Active = 1 
SELECT count(*) FROM IndexTest WHERE Active = 0 

SELECT count(*) FROM IndexTest WHERE IndexedValue = '1' 
SELECT count(*) FROM IndexTest WHERE IndexedValue = 'Many' 

यह मेरे लिए लगता है कि यह हमेशा इस क्वेरी योजना पर अनुक्रमित उपयोग करता है:

query plan

+0

धन्यवाद। इससे मदद मिलती है। यदि मैं सक्रिय = 0 और indexedValue = '1' का उपयोग करता हूं तो यह तालिका स्कैन करेगा जबकि सक्रिय = 1 और IndexValue = '1' अनुक्रमणिका का उपयोग करेगा। – sgmoore

+0

बहुत अच्छा परीक्षण नहीं है। आपको निश्चित रूप से 'SELECT *' का उपयोग करना चाहिए, यह हमेशा 'COUNT (*)' के लिए अनुक्रमणिका का उपयोग करेगा –

1

आप बस के आंकड़ों पर नज़र और देख सकते हैं अपने लिए :) DBCC SHOW_STATISTICS

हिस्टोग्राम बनाने के लिए, क्वेरी अनुकूलक स्तंभ मान सॉर्ट करता, मानों प्रत्येक से मेल की संख्या की गणना करता है: टिप्पणी अनुभाग देखें, यह कैसे हिस्टोग्राम वास्तव में संग्रहित और उपयोग किया जाता है का एक अच्छा व्याख्या है अलग कॉलम मान और फिर कॉलम मानों को में अधिकतम 200 संगत हिस्टोग्राम चरणों में एकत्रित करता है। प्रत्येक चरण में कॉलम मानों की एक श्रृंखला शामिल होती है जिसके बाद ऊपरी बाध्य कॉलम मान होता है। सीमा मानों को छोड़कर, सीमा मानों के बीच सभी संभावित कॉलम मान शामिल हैं। सॉर्ट किए गए कॉलम मानों का सबसे कम पहले हिस्टोग्राम चरण के लिए ऊपरी सीमा मान है।

alt text

प्रत्येक हिस्टोग्राम कदम के लिए:

  • बोल्ड लाइन ऊपरी सीमा मान (RANGE_HI_KEY) और कई बार यह होता है की संख्या (EQ_ROWS)
  • ठोस क्षेत्र का प्रतिनिधित्व करता है RANGE_HI_KEY के बाईं ओर कॉलम मानों की श्रेणी और प्रत्येक कॉल की औसत संख्या का प्रतिनिधित्व करता है umn मान होता है (AVG_RANGE_ROWS)। पहले हिस्टोग्राम कदम के लिए AVG_RANGE_ROWS हमेशा 0.
  • बिंदीदार लाइनों रेंज (DISTINCT_RANGE_ROWS) और मानों की कुल संख्या रेंज में में विशिष्ट मानों की कुल संख्या का अनुमान लगाने के लिए इस्तेमाल किया नमूना मूल्यों का प्रतिनिधित्व है (RANGE_ROWS) । क्वेरी ऑप्टिमाइज़र AVG_RANGE_ROWS की गणना करने के लिए RANGE_ROWS और DISTINCT_RANGE_ROWS का उपयोग करता है और नमूना मानों को संग्रहीत नहीं करता है।

क्वेरी अनुकूलक उनके सांख्यिकीय महत्व के अनुसार हिस्टोग्राम चरणों परिभाषित करता है। हिस्टोग्राम में चरणों की संख्या को कम करने के दौरान सीमा मानों के बीच अंतर को अधिकतम करते हुए अधिकतम अंतर एल्गोरिदम का उपयोग करता है। चरणों की अधिकतम संख्या 200 है। हिस्टोग्राम चरणों की संख्या अलग-अलग मानों की संख्या से कम हो सकती है, यहां तक ​​कि 200 सीमा अंकों से कम वाले कॉलम के लिए भी। उदाहरण के लिए, 100 विशिष्ट मान वाले कॉलम में 100 से कम सीमा बिंदु वाले हिस्टोग्राम हो सकते हैं।

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