मैं एक क्वेरी के बाहर कुछ और प्रदर्शन को सहने की कोशिश कर रहा हूं जो ~ 250 मिलियन रिकॉर्ड के साथ एक तालिका तक पहुंच रहा है। वास्तविक (अनुमानित नहीं) निष्पादन योजना के मेरे पढ़ने से, पहली अड़चन एक क्वेरी है जो इस तरह दिखती है:
select
b.stuff,
a.added,
a.value
from
dbo.hugetable a
inner join
#smalltable b on a.fk = b.pk
where
a.added between @start and @end;
नीचे दी गई सारणी और अनुक्रमित की परिभाषाओं के लिए नीचे देखें।
निष्पादन योजना यह दर्शाती है कि #smalltable पर नेस्टेड लूप का उपयोग किया जा रहा है, और hugetable पर इंडेक्स स्कैन को 480 बार (#smalltable में प्रत्येक पंक्ति के लिए) निष्पादित किया जा रहा है। यह मुझे पीछे की ओर लगता है, इसलिए मैंने इसके बजाय एक मर्ज जॉइन को मजबूर करने की कोशिश की है:
select
b.stuff,
a.added,
a.value
from
dbo.hugetable a with(index = ix_hugetable)
inner merge join
#smalltable b with(index(1)) on a.fk = b.pk
where
a.added between @start and @end;
अनुक्रमणिका (पूर्ण परिभाषा के लिए नीचे देखें) में कॉलम fk (ज्वाइन प्रेडिकेटेट), जोड़े गए (जहां क्लॉज में इस्तेमाल किया गया है) और आरोही क्रम में आईडी (बेकार) शामिल हैं, और मूल्य शामिल हैं ।
जब मैं ऐसा करता हूं, हालांकि, क्वेरी 2 1/2 मिनट से अधिक 9 तक चलती है। मुझे उम्मीद होगी कि संकेत एक अधिक कुशल जुड़ाव को बाध्य करेंगे जो केवल प्रत्येक तालिका पर एक ही पास करता है, लेकिन स्पष्ट रूप से नहीं।
किसी भी मार्गदर्शन का स्वागत है। यदि आवश्यक हो तो अतिरिक्त जानकारी।
अपडेट (2011/06/02)
तालिका में अनुक्रमण को पुनर्गठित करने के बाद, मैंने महत्वपूर्ण प्रदर्शन अंतर्द्वंद बनाए हैं, हालांकि जब मैंने बड़ी तालिका में डेटा को सारांशित करने की बात आती है, तो मुझे एक नई बाधा दी है। परिणाम महीने से एक सारांश है, जो वर्तमान में निम्नलिखित की तरह दिखता है:
select
b.stuff,
datediff(month, 0, a.added),
count(a.value),
sum(case when a.value > 0 else 1 end) -- this triples the running time!
from
dbo.hugetable a
inner join
#smalltable b on a.fk = b.pk
group by
b.stuff,
datediff(month, 0, a.added);
वर्तमान में, hugetable में एक क्लस्टर इंडेक्स pk_hugetable (added, fk)
(प्राथमिक कुंजी) है, और एक गैर-क्लस्टर इंडेक्स है जो दूसरे रास्ते पर जा रहा है ix_hugetable (fk, added)
।
उपरोक्त 4 कॉलम के बिना, ऑप्टिमाइज़र पहले से ही नेस्टेड लूप जॉइन करता है, बाहरी इनपुट के रूप में #smalltable का उपयोग करते हुए, और एक गैर-क्लस्टर इंडेक्स लूप को आंतरिक लूप (480 बार फिर से निष्पादित करना) के रूप में उपयोग करता है। मुझे चिंता क्या अनुमानित पंक्तियों (12,958.4) और वास्तविक पंक्तियों (74,668,468) के बीच असमानता है। इन आरी की सापेक्ष लागत 45% है। हालांकि रनिंग टाइम एक मिनट से कम है।
4 वें कॉलम के साथ, रनिंग टाइम 4 मिनट तक बढ़ जाता है। यह समान सापेक्ष लागत (45%) के लिए इस बार (2 निष्पादन) क्लस्टर्ड इंडेक्स पर तलाश करता है, हैश मैच (30%) के माध्यम से एकत्र करता है, फिर #smalltable (0%) पर एक हैश जुड़ता है।
मैं अपनी अगली कार्रवाई के लिए अनिश्चित हूं। मेरी चिंता यह है कि न तो तिथि सीमा की खोज होती है और न ही सम्मिलित विधेयकों की गारंटी दी जाती है या यहां तक कि उन सभी के परिणाम में भारी गिरावट की संभावना है। अधिकांश मामलों में दिनांक सीमा केवल रिकॉर्ड के 10-15% के बराबर हो जाएगी , और fk पर आंतरिक जुड़ाव शायद 20-30% को फ़िल्टर कर सकता है।
जैसा कि विल ए द्वारा अनुरोध किया गया है, के परिणाम sp_spaceused
:
name | rows | reserved | data | index_size | unused
hugetable | 261774373 | 93552920 KB | 18373816 KB | 75167432 KB | 11672 KB
#smalltable के रूप में परिभाषित किया गया है:
create table #endpoints (
pk uniqueidentifier primary key clustered,
stuff varchar(6) null
);
जबकि dbo.hugetable को इस प्रकार परिभाषित किया गया है:
create table dbo.hugetable (
id uniqueidentifier not null,
fk uniqueidentifier not null,
added datetime not null,
value decimal(13, 3) not null,
constraint pk_hugetable primary key clustered (
fk asc,
added asc,
id asc
)
with (
pad_index = off, statistics_norecompute = off,
ignore_dup_key = off, allow_row_locks = on,
allow_page_locks = on
)
on [primary]
)
on [primary];
निम्नलिखित सूचकांक परिभाषित के साथ:
create nonclustered index ix_hugetable on dbo.hugetable (
fk asc, added asc, id asc
) include(value) with (
pad_index = off, statistics_norecompute = off,
sort_in_tempdb = off, ignore_dup_key = off,
drop_existing = off, online = off,
allow_row_locks = on, allow_page_locks = on
)
on [primary];
आईडी क्षेत्र बेमानी, पिछले एक डीबीए जो जोर देकर कहा कि एक से शिल्पकृति है सभी तालिकाओं हर जगह एक GUID, कोई अपवाद नहीं होना चाहिए।