गैर-सूचीबद्ध सूचकांक सम्मिलित करें


10

कहो कि मेरे पास एक तालिका है:

create table SomeTable
(
    id int identity(1, 1) not null primary key clustered,
    SomeString1 varchar(50) not null,
    SomeString2 varchar(50) not null
)
go

create nonclustered index IX_SomeString1
on SomeTable(SomeString1)
go

अगर मुझे ऐसा करना था:

insert into SomeTable(SomeString1, SomeString2)
values('foo', 'bar')
go

और वास्तविक निष्पादन योजना देखें, मैं केवल एक क्लस्टर इंडेक्स इंसर्ट देखता हूं । मैं निष्पादन योजना में गैर- सूचीबद्ध सूचकांक सम्मिलित क्यों नहीं देख रहा हूँ ?


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

@ जेएनके लेकिन अगर मैं ए करता हूं select * from SomeTable where String1 = 'foo', तो मैं देखता हूं कि क्वेरी ऑप्टिमाइज़र वास्तव में IX_SomeString1सूचकांक की तलाश के लिए सूचकांक का चयन करता है । तो यह उस इंडेक्स को अपडेट करना चाहिए, नहीं?

1
आप इसके लिए आंकड़े देख सकते हैं और देख सकते हैं। यह निष्पादन योजना प्रदर्शन में भी कमी हो सकती है। क्या आपने xml की जाँच की है?
JNK

1
SQL सर्वर या तो एक विस्तृत या एक संकीर्ण योजना का उपयोग कर सकता है जो इस बात पर निर्भर करता है कि कितनी पंक्तियाँ प्रभावित हुई हैं। यह नियंत्रित करता है कि क्या अनुरक्षण अनुरक्षण परिचालन अलग से होता है और योजना में अलग-अलग परिचालनों के साथ या एक साथ दिखाया जाता है और CI ऑपरेशन के भाग के रूप में दिखाई देता है।
मार्टिन स्मिथ

1
@MartinSmith महान स्पष्टीकरण और मुझे नहीं पता था कि। लिंक और टिप्पणी के लिए धन्यवाद। मुझे जवाब देना चाहिए, मुझे विश्वास है।

जवाबों:


9

एकल पंक्ति सम्मिलित के लिए आपको एक संकीर्ण / प्रति-पंक्ति योजना मिलती है

INSERT INTO SomeTable(SomeString1, SomeString2)
SELECT TOP 1 type, type
FROM master..spt_values

संकीर्ण योजना

यदि आप Clustered Index Insert Operator का चयन करते हैं और गुण विंडो देखते हैं तो आप वही जानकारी देख सकते हैं जो XML में दिखाई गई है।

गुण विंडो

यदि आप 1,000 पंक्तियों के लिए प्रयास करते हैं

INSERT INTO SomeTable(SomeString1, SomeString2)
SELECT TOP 1000 type, type
FROM master..spt_values

आपको एक अलग विस्तृत / प्रति-इंडेक्स योजना मिलती है, जो अलग-अलग अलग हो जाती है

वाइड प्लान

दोनों के बारे में अधिक जानकारी के लिए देखें वाइड बनाम नैरो प्लान या क्रेग फ्रीडमैन का ब्लॉग


6

कभी भी चित्रमय योजना के प्रदर्शन पर भरोसा न करें, केवल newbies के लिए है। पेशेवरों हमेशा XML को देखो। NC ऑपरेशन वहीं है:

<Update DMLRequestSort="false">
  <Object Database="[testdb]" Schema="[dbo]" Table="[SomeTable]" Index="[PK__SomeTabl__3213E83F4AAF1C98]" IndexKind="Clustered" />
  <Object Database="[testdb]" Schema="[dbo]" Table="[SomeTable]" Index="[IX_SomeString1]" IndexKind="NonClustered" />

5
मैं यह नहीं कहूंगा कि यह केवल "newbies के लिए" एक लंबा खिंचाव है।
डेव मार्कले

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