কীভাবে কোনও কোয়েরিটি অনুকূলিত করা যায় যাতে এটি প্রথমে একটি সূচকে এবং তারপরে তার পরে অন্য সূচীর সন্ধান করে


12

আমার কাছে উপগ্রহের ডেটা থেকে পৃথিবীর পরিমাপের দুটি সেট রয়েছে, প্রতিটি সময় ক্ষেত্র (গড় জুলিয়ান তারিখের জন্য এমজেডি) এবং ভূগোলের অবস্থানগুলি (জিওপয়েন্ট, স্পেসিয়াল) এবং আমি দুটি সেটের মধ্যে একযোগের সন্ধান করছি যাতে তাদের সময়গুলি একটি দোরের সাথে মিলে যায় 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 এম রয়েছে


আপনি যদি এই ইঙ্গিতগুলি সরিয়ে থাকেন তবে আপনার প্রশ্নের পরিকল্পনার মতো দেখতে কেমন?
জেন 18

@ জেন, আমি পোস্টটি সম্পাদনা করেছি এবং নো-হিন্ট ক্যোয়ারী প্ল্যান যুক্ত করেছি। এটি সেকশনগুলির সাথে স্ক্যানগুলি প্রতিস্থাপন করে এবং সময়টি অস্বাভাবিক।
ব্যবহারকারী 261963

উত্তর:


6

সমস্যাটি হ'ল এটি (এবং স্থানিক সূচকগুলি জেনে রাখা সম্ভবত সম্ভবত) ধরে নিতে পারে যে স্থানিক ফিল্টারটি সময়ের ফিল্টারের চেয়ে অনেক বেশি নির্বাচনী হবে।

তবে যদি 200 কিলোমিটারের মধ্যে আপনার কয়েক মিলিয়ন রেকর্ড থাকে তবে তা উল্লেখযোগ্যভাবে খারাপ হতে পারে।

আপনি এটি 200 কিলোমিটারের মধ্যে রেকর্ডগুলি সন্ধান করতে বলছেন, যা কিছু স্থানিক অর্ডারের অর্ডারযুক্ত ডেটা দেয়। সেখানে নিকটবর্তী রেকর্ডগুলি সন্ধানের অর্থ প্রতিটি পরীক্ষা করা।

অন্যথায় আপনি সময় অনুযায়ী রেকর্ড সন্ধান করছেন, এবং আপনি সময় ক্রমে ফলাফল পাচ্ছেন। তারপরে, 200 কিলোমিটার ব্যাসার্ধে এই তালিকাটি ফিল্টার করা প্রতিটি পরীক্ষা করার বিষয়।

আপনি যদি এইভাবে দুটি ব্যাপ্তিতে ডেটা ফিল্টার করেন তবে একটি সূচক ব্যবহার করে দ্বিতীয় ফিল্টার প্রয়োগ করা শক্ত হয়ে যায়। আপনি যদি টাইম ফিল্টারটি আরও শক্ত করে থাকেন তবে স্থানিক সূচকটি ব্যবহার না করার কথা বলাই ভাল off

যদি উভয়ই স্বতন্ত্রভাবে বৃহত হয় এবং এটি কেবল একত্রে শক্ত হয় তবে আপনার আরও জটিল সমস্যা রয়েছে, এটি লোকে দীর্ঘকাল সমাধান করার চেষ্টা করেছে এবং যা 3D (এবং এর বাইরে) অন্তর্ভুক্ত সূচকের দ্বারা খুব সুন্দর সমাধান করা যেতে পারে one স্থান। ব্যতীত এসকিউএল সার্ভারের সেগুলি নেই।

দুঃখিত।

সম্পাদনা করুন: আরও তথ্য ...

সময়ের নির্দিষ্ট রেখাগুলি সময় সীমার সন্ধান করার ক্ষেত্রে এটি একই ধরণের সমস্যা। আপনি যখন সেই বিন্দুটির আগে শুরু হওয়া রেকর্ডগুলি সন্ধান করেন, তারপরে আপনার শেষ সময়গুলির একটি নিরবচ্ছিন্ন আবছা - এবং তদ্বিপরীত। যদি আপনি ফোন বইয়ের এমন লোকদের সন্ধান করেন যাদের নামগুলি এফ দিয়ে শুরু হয়, আপনি খুব সহজেই আর যাদের প্রথম নাম আর দিয়ে শুরু করেন সেই লোকদের খুঁজে পেতে আপনি আশা করতে পারবেন না। এবং প্রথম নামের একটি সূচক একই কারণে হয় না। যখন আপনার প্রথম সূচকটি সমতা নয় তখন পরবর্তী সূচকে জিনিসগুলি সন্ধান করা শক্ত।

এখন, যদি আপনি নিজের তারিখ ফিল্টারটিকে একটি সমতা ফিল্টারে (বা সমতা ফিল্টারগুলির ধারাবাহিক) রূপান্তর করতে পারেন, তবে আপনি একটি সুযোগের পক্ষে দাঁড়াতে পারেন, কেবলমাত্র স্থানিক সূচকটি একটি বিশেষ ধরণের সূচক এবং দ্বিতীয় স্তরের হিসাবে ব্যবহার করা যায় না একটি যৌগিক সূচক।

সুতরাং আপনি একটি বিশ্রী পরিস্থিতি রেখে গেছেন, আমি ভীত। :(

সম্পাদনা করুন: চেষ্টা করুন:

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
where h.GeoPoint.STDistance(m.GeoPoint)/1000.0 < 200
option( table hint ( h, index(ix_MJD) ) );

লক্ষ্য করুন যে আমি 200 এর সাথে তুলনা করার আগে 1000 টি দিয়ে ভাগ করে ইচ্ছাকৃতভাবে সরগবিলিটি ভঙ্গ করছি I আমি চাই চাই এই চেহারাটি মূল চেহারাতে করা হোক।

মনে মনে, আপনি ix_MJD উভয় সূচীতে ইনক্লুডিং জিওপয়েন্ট এবং সময় দ্বারা অনুসন্ধানগুলির (এবং ইঙ্গিতগুলি) প্রয়োজনীয়তা এড়াতে পারেন। এটি অবশ্যই কোয়েরি পরিকল্পনার বাইরে কিছুটা তাপ নেবে।


আমি জানি না এটির কোনও পরিবর্তন হয় কিনা, তবে টাইম ফিল্টারটি অনেক বেশি নির্বাচনী।
ব্যবহারকারী 261963

ঠিক আছে. তাহলে কি সমস্ত সময়ের সাথে মিলে যাওয়া সারিগুলি সনাক্ত করা এবং তারপরে সূচি ছাড়াই প্রতিটি অবস্থান পরীক্ষা করা গ্রহণযোগ্য?
রব ফারলে

... সুতরাং পরিকল্পনাটি আপনার আসলটির মতো দেখাচ্ছে তবে এতে একটি অতিরিক্ত প্রিকিডেট বা ফিল্টার রয়েছে।
রব ফারলে

দ্রুত সম্পাদনা করে কিছু পরিবর্তন প্রস্তাবিত। আপনার মি সম্পর্কে ইঙ্গিত করার দরকার নেই, কেবল এইচ। যদিও আপনি কোনটি আপনি 1/8 যোগ করছেন তাতে অদলবদল করতে পারেন, আপনি যদি ছোট টেবিল থেকে কলামটি পরিবর্তন করছেন এবং সেই মানগুলি বৃহত্তর সন্ধানের জন্য ব্যবহার করছেন, তাও সাহায্য করবে। যদি h 8M হয় এবং মিটার 1 মি হয়, তবে বিটওয়ুইনকে প্রাকটিকেশনটি ছেড়ে যান এবং কেবল h এর জন্য ইঙ্গিত করুন। যদি এটি অন্যভাবে হয় তবে আপনার ভবিষ্যদ্বাণীটি এবং ইঙ্গিতটি পরিবর্তন করুন (তবে ইঙ্গিতটি পরিবর্তনের চেয়ে সেই কলামগুলি আপনার সূচীতে যুক্ত করা ভাল)।
রব ফারলে

সমস্ত টেবিলের ইঙ্গিতগুলি বের করা শেষ পর্যন্ত সবচেয়ে ভাল কাজ করে বলে মনে হচ্ছে, যতক্ষণ না আমি মি এর মাঝে এবং অন্যদিকে না। কোয়েরিটি আর জিওপয়েন্টের সূচীগুলি ব্যবহার করে না, তবে এটি সেগুলি কার্যকরভাবে ব্যবহার করছে না। আমি জিজেপয়েন্ট কলামটি এমজেডি সূচকে অন্তর্ভুক্ত করেছি এবং এটি অনেক সাহায্য করেছিল। select top 10000 h.Time, m.Time, m.GeoPoint.STDistance(h.GeoPoint), h.mjd-m.mjd from L2V5.dbo.header h join L2.dbo.MLS_Header m on m.GeoPoint.STDistance(h.GeoPoint)<200000 and m.mjd between h.mjd-.125 and h.mjd+.125 order by h.mjd
ব্যবহারকারী 261963
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.