এই পার্টিশন করা ভিউতে অপ্রাসঙ্গিক টেবিলগুলি অপসারণের জন্য অপ্টিমাইজারকে জোর করা কি সম্ভব?


22

আমি বড় টেবিলগুলির জন্য বিভিন্ন আর্কিটেকচার পরীক্ষা করছি এবং একটি পরামর্শ যা আমি দেখেছি তা হল পার্টিশনযুক্ত ভিউ ব্যবহার করা, যার মাধ্যমে একটি বৃহত টেবিলটি ছোট ছোট "পার্টিশনযুক্ত" টেবিলগুলিতে বিভক্ত হয়।

1 , 2 , 3 , 4

এই পদ্ধতির পরীক্ষার সময়, আমি এমন কিছু আবিষ্কার করেছি যা আমার কাছে পুরোটা বোঝায় না। আমি যখন ফ্যাক্ট ভিউতে "পার্টিশন কলাম" ফিল্টার করি, তখন অপটিমাইজার কেবলমাত্র প্রাসঙ্গিক টেবিলগুলিতে সন্ধান করে। তদ্ব্যতীত, আমি যদি সেই কলামটিতে মাত্রার টেবিলটিতে ফিল্টার করি তবে অপটিমাইজার অপ্রয়োজনীয় টেবিলগুলি সরিয়ে দেয়।

তবে আমি যদি মাত্রাটির অন্য কোনও দিকগুলিতে ফিল্টার করি তবে প্রতিটি বেস টেবিলের পিকে / সিআইতে অপ্টিমাইজার সন্ধান করে।

এখানে প্রশ্নযুক্ত প্রশ্নগুলি এখানে:

select 
    od.[Year], 
    AvgValue = avg(ObservationValue)
from dbo.v_Observation o 
join dbo.ObservationDates od
    on o.ObservationDateKey = od.DateKey
where o.ObservationDateKey >= 20000101
    and o.ObservationDateKey <= 20051231
group by od.[Year];

select 
    od.[Year], 
    AvgValue = avg(ObservationValue)
from dbo.v_Observation o 
join dbo.ObservationDates od
    on o.ObservationDateKey = od.DateKey
where od.DateKey >= 20000101
    and od.DateKey <= 20051231
group by od.[Year];

select 
    od.[Year], 
    AvgValue = avg(ObservationValue)
from dbo.v_Observation o 
join dbo.ObservationDates od
    on o.ObservationDateKey = od.DateKey
where od.[Year] >= 2000 and od.[Year] < 2006
group by od.[Year];

কীতে ফ্যাক্ট ফিল্টার

কীতে ডিমে ফিল্টার

দিকের উপর ম্লান ফিল্টার

এসকিউএল সেন্ট্রি প্ল্যান এক্সপ্লোরার সেশনের একটি লিঙ্ক এখানে

আমি অনুরূপ ফ্যাশনটিতে প্রতিক্রিয়া জানাতে পার্টিশন নির্মূলতা পাই কিনা তা দেখার জন্য আমি বৃহত্তর টেবিলটি বাস্তবে বিভাজনে কাজ করছি।

আমি (সরল) ক্যোয়ারির জন্য পার্টিশন নির্মূলকরণ পাই যা মাত্রার দিকটি ফিল্টার করে।

ইতিমধ্যে, এখানে ডাটাবেসের একটি পরিসংখ্যান-কেবল অনুলিপি রয়েছে:

https://gist.github.com/swasheck/9a22bf8a580995d3b2aa

"পুরাতন" কার্ডিনালিটির অনুমানকারী কম ব্যয়বহুল পরিকল্পনা পেয়েছে তবে এটি প্রতিটি (অপ্রয়োজনীয়) সূচকের সন্ধানে কার্ডিনালিটির কম অনুমানের কারণে।

মাত্রাটির অন্য কোনও দিক দিয়ে ফিল্টার করার সময় কী কলামটি ব্যবহার করার জন্য অপ্টিমাইজার পাওয়ার কোনও উপায় আছে কিনা তা আমি জানতে চাই যাতে এটি অপ্রাসঙ্গিক টেবিলগুলিতে সন্ধানগুলি দূর করতে পারে।

এসকিউএল সার্ভার সংস্করণ:

Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 
    Feb 20 2014 20:04:26 
    Copyright (c) Microsoft Corporation
    Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

মাত্র একটি এফওয়াইআই .. শেষ স্ট্যাট স্ট্রিমটি কলুষিত হয়েছেCREATE STATISTICS [_WA_Sys_00000008_2FCF1A8A] ON [dbo].[Observation_2010]([StationStateCode]) WITH STATS_STREAM = 0x01000000010000000000000000000000D4531EDB00000000D5080000000000009508000000000000AF030000AF000000020000000000000008D000340000000007000000E65DE0007DA5000076F9780000000000867704000000000000000000ABAAAA3C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
কিন শাহ

দেখে মনে হচ্ছে কেবলমাত্র স্ট্যাটাসের ডাটাবেসের স্ক্রিপ্টটি কেটে গেছে। আমি "সম্পূর্ণ ফাইলটি দেখুন" ক্লিক করে জিপটি ডাউনলোড করার চেষ্টা করেছি, তবে উভয় উপায়েই আমার কাছে ObservationDatesটেবিলের কোনও পরিসংখ্যান নেই । আমি পলের মতো একই পরিকল্পনাটি পাচ্ছি না, এমনকি 4199 দিয়েও, এবং আমার মনে হয় এই কারণেই।
জেফ প্যাটারসন

@ জিফপ্যাটারসন এটি আমার পক্ষে কাজ করে। আপনি কি কাঁচা ফাইলের লিঙ্কটি ক্লিক করেছেন? gist.githubusercontent.com/swasheck/9a22bf8a580995d3b2aa/raw/... তবে কিন লক্ষনীয়, গত পরিসংখ্যান প্রবাহ ক্ষতিগ্রস্ত: /
swasheck

আমি কাঁচা ফাইলের লিঙ্কটি ক্লিক করেছি। স্ক্রিপ্টটি কাজ করে (ধরণের সমস্যাটি উল্লেখ করা ব্যতীত) তবে এতে পরিসংখ্যান তৈরি করার কোনও যুক্তি নেই ObservationDatesUPDATE STATISTICS ObservationDates WITH ROWCOUNT = 10000পল যে পরিকল্পনাটি দেখিয়েছিল তা পাওয়ার জন্য আমি ম্যানুয়ালি দৌড়ে এসেছি ।
জিওফ প্যাটারসন

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

উত্তর:


10

ট্রেস পতাকা 4199 সক্ষম করুন।

আমাকেও ইস্যু করতে হয়েছিল:

UPDATE STATISTICS dbo.ObservationDates 
WITH ROWCOUNT = 73049;

নীচে প্রদর্শিত পরিকল্পনা পেতে। আপলোড থেকে এই টেবিলের পরিসংখ্যানগুলি অনুপস্থিত ছিল। 73,049 চিত্রটি প্ল্যান এক্সপ্লোরার সংযুক্তিতে টেবিল কার্ডিনালিটির তথ্য থেকে এসেছে। আমি দুটি লজিকাল প্রসেসরের সাথে এসকিউএল সার্ভার 2014 এসপি 1 সিই 4 (বিল্ড 12.0.4436) ব্যবহার করেছি, সর্বাধিক মেমরি 2048 এমবিতে সেট করা হয়েছে এবং 4199 এর বাইরে কোনও ট্রেস পতাকা নেই।

তারপরে আপনার একটি কার্যকর করার পরিকল্পনা পাওয়া উচিত যা গতিশীল পার্টিশন নির্মূলের বৈশিষ্ট্যযুক্ত:

select 
    od.[Year], 
    AvgValue = avg(ObservationValue)
from dbo.v_Observation o 
join dbo.ObservationDates od
    on o.ObservationDateKey = od.DateKey
where 
    od.[Year] >= 2000 and od.[Year] < 2006
group by 
    od.[Year]
option (querytraceon 4199);

পরিকল্পনা খণ্ড:

পরিকল্পনা খণ্ড

এটি আরও খারাপ দেখতে পারে তবে ফিল্টারগুলি সমস্ত স্টার্ট আপ ফিল্টার। ভবিষ্যদ্বাণী করার একটি উদাহরণ হ'ল:

ফিল্টার বৈশিষ্ট্য

লুপটির পুনরাবৃত্তি অনুসারে, স্টার্ট-আপ প্রিকেটটি পরীক্ষা করা হয়, এবং এটি যদি সত্য হয় তবেই এটির নিচে ক্লাস্টারড ইনডেক্স অনুসন্ধান করা হয়। সুতরাং, গতিশীল পার্টিশন নির্মূল।

এই সম্ভবত নয় বেশ যেমন স্ট্যাটিক বর্জন যেমন দক্ষ, বিশেষ করে যদি পরিকল্পনা সমান্তরাল হয়।

তোমার মত নির্দেশ চেষ্টা করতে হতে পারে MAXDOP 1, FAST 1বা FORCESEEKএকই পরিকল্পনা পেতে দৃশ্য উপর। পার্টিশনযুক্ত দর্শনগুলি (পার্টিশনযুক্ত টেবিলের মতো) সহ অপ্টিমাইজারের ব্যয় বহুল পছন্দ জটিল হতে পারে।

মূল বিষয়টি হ'ল আপনার এমন একটি পরিকল্পনা দরকার যা পার্টিশনযুক্ত দর্শনগুলির সাথে ডায়নামিক পার্টিশন নির্মূলের জন্য স্টার্ট-আপ ফিল্টারগুলি বৈশিষ্ট্যযুক্ত।


এম্বেড থাকা USE PLANইঙ্গিত সহ প্রশ্ন : (জিস্ট.github.com এর মাধ্যমে):


1
দুর্দান্ত তথ্য, ধন্যবাদ পল! আমি আমার উত্তরটি লেখার পরেও ভাবছিলাম যে এসকিউএল সার্ভার কেন এই ধরণের নির্মূলকরণ করতে পারে না। সেখানে দেখা যাচ্ছে, আমি এটি আগে দেখিনি!
জিওফ প্যাটারসন

6

আমার পর্যবেক্ষণ সবসময়ই ছিল যে পার্টিশনযুক্ত দৃশ্যে "টেবিল বিলোপ" পাওয়ার জন্য আপনার অবশ্যই পার্টিশন কলামের মান (বা মানের সীমা) নির্দিষ্টভাবে ক্যোয়ারিতে উল্লেখ করতে হবে in এটি এসকিউএল সার্ভার ২০১৪ থেকে এসকিউএল সার্ভার ২০১৪ এর মাধ্যমে উত্পাদনে পার্টিশনযুক্ত দর্শনগুলি ব্যবহারের অভিজ্ঞতার ভিত্তিতে is

এসকিউএল সার্ভারের একটি লুপ জয়েন অপারেটরের ধারণা নেই যেখানে ইঞ্জিনটি গতিবেগে লুপের বাইরের দিকে সারিটির মানের উপর ভিত্তি করে লুপের অভ্যন্তরীণ দিকের সঠিক টেবিলে সরাসরি অনুসন্ধান করতে পারে aim যাইহোক, পলের উত্তর যেমন ব্যাখ্যা করেছে , অবিচ্ছিন্ন সময়ে লুপের অভ্যন্তরীণ অংশে অপ্রাসঙ্গিক টেবিলগুলি গতিশীলভাবে এড়াতে স্টার্ট-আপ ফিল্টারগুলি নিয়ে একটি পরিকল্পনা হওয়ার সম্ভাবনা রয়েছে (প্রকৃতপক্ষে সন্ধানটি সম্পাদন করে লোগারিথমিকের বিপরীতে)।

নোট করুন যে পার্টিশনযুক্ত টেবিলগুলির জন্য, তবে এই ধরণের সন্ধানটি (একটি নির্দিষ্ট পার্টিশনের কাছে) সমর্থিত।

যদি আপনি বিভাজনযুক্ত দর্শনগুলি ব্যবহারের বিষয়ে স্থির হন তবে অন্য বিকল্পটি হ'ল আপনার ক্যোয়ারিকে একাধিক ক্যোয়ারিতে বিভক্ত করা যেমন:

-- Gather than the min/max values for the partition column
DECLARE @minDateKey INT,
        @maxDateKey INT
SELECT @minDateKey = MIN(DateKey),
        @maxDateKey = MAX(DateKey)
FROM dbo.ObservationDates od
WHERE od.[Year] >= 2000 and od.[Year] < 2006

-- Since I have a stats-only copy of the database, simulate having run the query above
-- (You can comment this out since you have the actual data.)
SELECT @minDateKey = 20000101, @maxDateKey = 20051231

-- Adjust the query to use the min/max values of the partition column
-- rather than filtering on a different column in the dimension table
select 
    od.[Year], 
    AvgValue = avg(ObservationValue)
from dbo.v_Observation o 
join dbo.ObservationDates od
    on o.ObservationDateKey = od.DateKey
WHERE od.DateKey >= @minDateKey AND od.DateKey <= @maxDateKey
group by od.[Year]
-- Must use OPTION RECOMPILE; otherwise the plan will touch all tables because it
-- must do so in order to be valid for all values of the parameters!
OPTION (RECOMPILE)

এটি নিম্নলিখিত পরিকল্পনা ফলন। এখন একটি অতিরিক্ত ক্যোয়ারী রয়েছে যা মাত্রা টেবিলটিকে আঘাত করে, তবে (সম্ভবত অনেক বড়) ফ্যাক্ট টেবিলের উপরের ক্যোয়ারীটি অনুকূলিত হয়েছে।

এখানে চিত্র বর্ণনা লিখুন


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

@ অ্যান্ড্রিএম যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে উত্তরটি হ'ল না, একই প্রভাবটি অর্জন করা হবে না এবং যদি আপনি দুটি প্রশ্নের একত্রিত করার চেষ্টা করেন তবে ক্যোয়ারী পরিকল্পনাটি পার্টিশনযুক্ত দর্শনের সমস্ত সারণীকে স্পর্শ করবে। আপনাকে প্রথমে ক্যোয়ারী নির্বাহ, তারপর মান পেস্ট করতে হলে 20000101এবং 20051231ভেরিয়েবল পরিবর্তে (অথবা আপনার অ্যাপ্লিকেশনের মধ্যে দুটি পৃথক প্রশ্নের মাধ্যমে অনুরূপ কিছু করতে), তারপর হ্যাঁ, একই প্রভাব ভেরিয়েবল ব্যবহার না করেই অর্জন করা যাবে।
জেফ প্যাটারসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.