मैं 20M पंक्तियों के साथ एक मेज है, और प्रत्येक पंक्ति 3 स्तंभ हैं: time
, id
, और value
। प्रत्येक के लिए id
और time
, value
स्थिति के लिए एक है । मैं time
एक विशिष्ट के लिए एक निश्चित के प्रमुख और अंतराल मूल्यों को जानना चाहता हूं id
।
मैंने इसे हासिल करने के लिए दो तरीकों का इस्तेमाल किया है। एक विधि जुड़ने का उपयोग कर रही है और दूसरी विधि विंडो फ़ंक्शन लीड / लैग का उपयोग क्लस्टर इंडेक्स के साथ time
और पर कर रही है id
।
मैंने निष्पादन समय द्वारा इन दोनों विधियों के प्रदर्शन की तुलना की। शामिल होने की विधि में 16.3 सेकंड लगते हैं और विंडो फ़ंक्शन विधि को सूचकांक बनाने के लिए समय सहित 20 सेकंड लगते हैं। इसने मुझे आश्चर्यचकित कर दिया क्योंकि विंडो फ़ंक्शन उन्नत प्रतीत होता है जबकि ज्वाइन मेथड्स ब्रूट फोर्स है।
यहाँ दो तरीकों के लिए कोड है:
सूचकांक बनाएँ
create clustered index id_time
on tab1 (id,time)
विधि से जुड़ें
select a1.id,a1.time
a1.value as value,
b1.value as value_lag,
c1.value as value_lead
into tab2
from tab1 a1
left join tab1 b1
on a1.id = b1.id
and a1.time-1= b1.time
left join tab1 c1
on a1.id = c1.id
and a1.time+1 = c1.time
IO सांख्यिकी का उपयोग कर उत्पन्न SET STATISTICS TIME, IO ON
:
यहां शामिल होने की विधि के लिए निष्पादन योजना है
विंडो फंक्शन विधि
select id, time, value,
lag(value,1) over(partition by id order by id,time) as value_lag,
lead(value,1) over(partition by id order by id,time) as value_lead
into tab2
from tab1
(केवल time
0.5 सेकंड से ऑर्डर करना ।)
यहां विंडो फ़ंक्शन विधि के लिए निष्पादन योजना है
IO आँकड़े
[
मैंने डेटा की जाँच की sample_orig_month_1999
और ऐसा लगता है कि कच्चे डेटा को अच्छी तरह से id
और द्वारा आदेश दिया गया है time
। क्या यह प्रदर्शन अंतर का कारण है?
ऐसा लगता है कि शामिल होने की विधि में विंडो फ़ंक्शन विधि की तुलना में अधिक तार्किक रीड हैं, जबकि पूर्व के लिए निष्पादन का समय वास्तव में कम है। यह क्योंकि पूर्व एक बेहतर समानांतरवाद है है?
संक्षिप्त कोड के कारण मुझे विंडो फ़ंक्शन विधि पसंद है, क्या इस विशिष्ट समस्या के लिए इसे गति देने का कोई तरीका है?
मैं विंडोज 10 64 बिट पर SQL सर्वर 2016 का उपयोग कर रहा हूं।