আমার কাছে উপগ্রহের ডেটা থেকে পৃথিবীর পরিমাপের দুটি সেট রয়েছে, প্রতিটি সময় ক্ষেত্র (গড় জুলিয়ান তারিখের জন্য এমজেডি) এবং ভূগোলের অবস্থানগুলি (জিওপয়েন্ট, স্পেসিয়াল) এবং আমি দুটি সেটের মধ্যে একযোগের সন্ধান করছি যাতে তাদের সময়গুলি একটি দোরের সাথে মিলে যায় 3 ঘন্টা (বা .125 দিন) এবং একে অপরের 200 কিলোমিটারের মধ্যে তাদের দূরত্ব।
আমি উভয় টেবিল এবং স্থানীয় টেবিলগুলিতে এমজেডি উভয় ক্ষেত্রের জন্য সূচি তৈরি করেছি।
আমি যখন কেবল সময়ের সীমাবদ্ধতায় যোগদান করি, তখন ডাটাবেসটি 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) ) )
যা 3 মিনিট সময় নিতে 3 মিনিট সময় নেয়।
প্রথমে এমজেডি সূচকটি অনুসন্ধান করার জন্য কোয়েরি অপ্টিমাইজারটিকে কীভাবে বলতে পারি, এবং তারপরে স্থানিক সূচক দ্বিতীয় (বা এটি ইতিমধ্যে কী করছে) এবং কয়টি ম্যাচের প্রত্যাশা রয়েছে তা জানিয়ে এটির কোনও উপায় আছে কি? যদি এটি ৮০০ সেকেন্ডের মধ্যে ৯০০ কিলোমিটারের মধ্যে has সেকেন্ডের মধ্যে দূরত্বের সাথে ১০০,০০০ ম্যাচ গুনতে পারে, তবে স্থানিক সূচকটি যুক্ত করা কি আরও দ্রুত ধীর হওয়া উচিত নয়?
অন্য কোনও টিপস বা ধারণার জন্য ধন্যবাদ।
সম্পাদনা: পরিকল্পনাগুলি কোনও ইঙ্গিত ছাড়াই কেমন দেখাচ্ছে এমন প্রশ্নের উত্তর দেওয়ার জন্য, এটি (এবং এটি চিরকাল লাগে):
এটি সম্ভবত উল্লেখযোগ্য যে একটি টেবিলে প্রায় 1M রেকর্ড এবং অন্যটিতে 8 এম রয়েছে