কেন আমার অর্ডার বাই দুটি টেবিলটি এক্সেসপেটের (ধীর) আগে এবং দ্রুত (দ্রুত) না করার পরে বাছাই করে?


12

এসকিউএল সার্ভার ২০০৮ আর 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

সুতরাং প্রশ্ন: আমি কীভাবে এটি করতে ক্যোয়ারী অপ্টিমাইজারকে নির্দেশ দিতে পারি?


3
এটি হ্যাশম্যাচের আগে বাছাই করে না, এটি সাজায় এবং তারপরে একটি মার্জ-যোগ (হ্যাশ-যোগ নয়) করে। হতে পারে হ্যাশ-জোর করে জোর দেওয়ার (বা একীভূত হওয়াতে বাধা দেওয়ার) কোনও ইঙ্গিত রয়েছে?
থিলো

3
দেখে মনে হচ্ছে যে এসকিউএল সার্ভার কোয়েরি অপটিমাইজার নির্ধারণ করেছে যে ডেটা বাছাই করা উপকারী ছিল যাতে এটি আরও ধীর হ্যাশ ম্যাচ জয়েন বা নেস্টেড লুপ
জোনের

9
আপনি কি EXCEPT(উদাহরণস্বরূপ OUTER JOIN) বিকল্প চেষ্টা করেছেন ? আমি বুঝতে পারি সিনট্যাক্সটি কম সুবিধাজনক তবে আপনি সূচির সাথে খেলতে পারবেন / ইঙ্গিতগুলি ভালভাবে যোগ দিতে পারবেন (বা আপনার প্রয়োজন হতে পারে না)। আপনি এখন বিকল্পটি ব্যবহার করছেন (প্রথমে একটি # টেম্প টেবিলের স্টাফ) সর্বশেষ অবলম্বন কাজ কিন্তু কিছু ক্ষেত্রে অপটিমাইজারকে কোনও প্রশ্নের দুটি অংশ সম্পূর্ণভাবে আলাদা করতে বাধ্য করার একমাত্র উপায় যা আপনি চান।
অ্যারন বারট্র্যান্ড

উত্তর:


1

এই দুটি ক্যোয়ারী পরিকল্পনার মধ্যে মূল পার্থক্য আসলে হ্যাশ ম্যাচ এবং মার্জ জোনের পার্থক্য। হ্যাশ ম্যাচটি আরও দক্ষ এবং আপনি দেখতে পাচ্ছেন ক্যোয়ারীটি বিকল্প 1 (সিটিই ব্যবহার না করে) তে দ্রুত চলে।

সিটিই একটি দুর্দান্ত সরঞ্জাম, তবে কমপ্লেক্স প্রেডিকেটস বা অ-ইউনিক প্যারেন্ট / চাইল্ড কী দুটি ক্ষেত্রে এটি কার্যকর নয় বলে মনে হচ্ছে। আপনার ক্ষেত্রে কোনও অনন্য কী নেই এবং এসকিউএল সার্ভারকে আপনার প্রয়োজনীয়তা পূরণে সক্ষম হতে প্রথমে ডেটা সেটগুলি বাছাই করতে হবে। নীচের লিঙ্কটি দেখুন যা আপনাকে এই ইস্যুতে আরও জানায়: http://blogs.msdn.com/b/sqlcat/archive/2011/04/28/optimize-recursive-cte-query.aspx

সুতরাং এটির মনে হচ্ছে আপনার স্বচ্ছলতাটি গ্রহণ করতে হবে বা WHILE লুপ দিয়ে যুক্তিটি আবার লিখতে হবে যা আরও কার্যকর হতে পারে।


0

এটি চেষ্টা করুন, আরও ভাল?

select * from
(
    select * from bigtable1
    except 
    select * from similar_bigtable2
) t
order by sort_column

0

এটি একটি আদর্শ সমাধান নয় তবে আপনি যদি একটি দক্ষ পরিকল্পনা তৈরির জন্য tsql গঠন করতে সক্ষম না হন তবে আপনি যে পরিকল্পনাটি চান তা জোর করার জন্য একটি পরিকল্পনা গাইড সেট করতে পারে। এটি করার অর্থ হ'ল যদি আরও দক্ষ পরিকল্পনাটি উপলব্ধ হয় তবে এসকিউএল এটিকে বিবেচনা করবে না তবে এটি একটি বিকল্প।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.