এসকিউএল সার্ভার ২০০৮ আর 2 ক্যোয়ারী অপ্টিমাইজার ধাঁধা
আমাদের দুটি টেবিল রয়েছে, উভয়ই 9 মিলিয়ন সারি রয়েছে। 70.000 সারি আলাদা, অন্যগুলি একই।
এটি দ্রুত, 13 সেকেন্ড,
select * from bigtable1
except select * from similar_bigtable2
এটি আউটপুটটি বাছাই করে এবং দ্রুতও হয়, 13 সেকেন্ডও,
select * into #q from bigtable1
except select * from similar_bigtable2
select * from #q order by sort_column
যদিও এটি অত্যন্ত ধীরে ধীরে:
;with q as (
select * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
এমনকি এমন একটি "কৌশল" যা আমি মাঝে মাঝে এসকিউএল সার্ভারকে ইঙ্গিত করার জন্য ব্যবহার করি যে এটি কোয়েরির একটি নির্দিষ্ট অংশটি চালিত হওয়ার আগে প্রাক্ক্যালকুলেট করা দরকার, কাজ করে না এবং ধীর অনুসন্ধানের ফলাফলও দেয়:
;with q as (
select top 100 percent * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
ক্যোয়ারীর দিকে তাকানোর কারণটির কারণটি খুঁজে পাওয়া শক্ত নয়:
এসকিউএল সার্ভার হ্যাশমেচের আগে দুটি ধরণের 9 মিলিয়ন সারি রাখে, আমি হ্যাশমেচের পরে কেবল এক ধরণের 70.000 সারি যুক্ত করতে পছন্দ করব prefer
সুতরাং প্রশ্ন: আমি কীভাবে এটি করতে ক্যোয়ারী অপ্টিমাইজারকে নির্দেশ দিতে পারি?
EXCEPT
(উদাহরণস্বরূপ OUTER JOIN
) বিকল্প চেষ্টা করেছেন ? আমি বুঝতে পারি সিনট্যাক্সটি কম সুবিধাজনক তবে আপনি সূচির সাথে খেলতে পারবেন / ইঙ্গিতগুলি ভালভাবে যোগ দিতে পারবেন (বা আপনার প্রয়োজন হতে পারে না)। আপনি এখন বিকল্পটি ব্যবহার করছেন (প্রথমে একটি # টেম্প টেবিলের স্টাফ) সর্বশেষ অবলম্বন কাজ কিন্তু কিছু ক্ষেত্রে অপটিমাইজারকে কোনও প্রশ্নের দুটি অংশ সম্পূর্ণভাবে আলাদা করতে বাধ্য করার একমাত্র উপায় যা আপনি চান।