मेरे पास उपग्रह डेटा से पृथ्वी माप के दो सेट हैं, प्रत्येक समय फ़ील्ड्स (माध्य जूलियन तिथि के लिए mjd) और भूगोल स्थिति (जियोप्वाइंट, स्पेसियल) और मैं दो सेटों के बीच संयोग की तलाश कर रहा हूं, जैसे कि उनका समय एक सीमा से मेल खाता है 3 घंटे (या .125 दिन) और एक दूसरे के 200 किमी के भीतर उनकी दूरी।
मैंने दोनों मेजों और स्थानिक तालिकाओं पर दोनों mjd क्षेत्रों के लिए अनुक्रमित किए हैं।
जब मैं सिर्फ समय की कमी में शामिल होता हूं, तो डेटाबेस 8 सेकंड में 100,000 मैचों की गणना करता है और उस समय के सभी 100,000 मैचों के लिए दूरी की गणना करता है। प्रश्न इस तरह दिखता है:
select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.mjd between m.mjd-.125 and m.mjd+.125
option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) )
और निष्पादित योजना है:
जब सॉर्ट किया गया, तो 9 की दूरी 200 किमी से कम थी, इसलिए मैच होते हैं। परेशानी यह है, जब मैं दूरी की बाधा को जोड़ता हूं और इसके बजाय इसे चलाता हूं,
select top 10 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.mjd between m.mjd-.125 and m.mjd+.125
and h.GeoPoint.STDistance(m.GeoPoint)<200000
option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) )
यह लंबे समय तक चला जाता है। जाहिर है, 8 सेकंड में, यह 100,000 समय मैच पा सकता था, जिनमें से 9 200 किमी से कम थे, इसलिए ऑप्टिमाइज़र को कुछ उप-इष्टतम की कोशिश करनी चाहिए। योजना दूरियों पर एक फिल्टर के साथ ऊपर के समान दिखती है (मैं अनुमान लगा रहा हूं)।
मैं इसके साथ स्थानिक सूचकांक के उपयोग को बाध्य कर सकता हूं:
select top 5 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.GeoPoint.STDistance(m.GeoPoint)<200000
and h.mjd between m.mjd-.125 and m.mjd+.125
option( table hint ( h, index(ix_MJD), index(ix_GeoPoint) ), table hint( m, index(ix_MJD) ) )
जिसके बाद 5 मैच खोजने में 3 मिनट लगते हैं।
मैं MJD इंडेक्स का उपयोग करने के लिए क्वेरी ऑप्टिमाइज़र को पहले कैसे बताता हूं, और फिर स्थानिक इंडेक्स सेकंड (या यह है कि यह पहले से क्या कर रहा है) और क्या कोई तरीका है जो मैं यह बताकर मदद कर सकता हूं कि कितने मैचों की उम्मीद है? यदि यह 8 सेकेण्ड में दूरी के साथ 100,000 मैचों की गणना कर सकता है, जिसमें 9 200 किमी के नीचे है, तो क्या स्थानिक सूचकांक के अलावा इसे तेजी से धीमा नहीं करना चाहिए?
किसी भी अन्य सुझावों या विचारों के लिए धन्यवाद।
संपादित करें: इस सवाल का जवाब देने के लिए कि योजना संकेत के बिना कैसी दिखती है, यह (और यह हमेशा के लिए लेता है):
शायद यह भी उल्लेखनीय है कि एक तालिका में लगभग 1M रिकॉर्ड हैं और दूसरे में 8M हैं