কীভাবে আমি এসকিউএল সার্ভারের ক্যোয়ারী ক্যাশে থেকে একটি নির্দিষ্ট খারাপ পরিকল্পনা সরিয়ে ফেলব?


33

আমাদের একটি বিশেষ এসকিউএল সার্ভার ২০০৮ ক্যোয়ারী রয়েছে (কোনও স্টোরড প্রোক নয়, তবে একই এসকিউএল স্ট্রিং - প্রতি 5 মিনিটে কার্যকর হয়) যা মাঝেমধ্যে একটি খুব খারাপ কোয়েরি প্ল্যানকে ক্যাশে করে।

এই ক্যোয়ারীটি সাধারণত কয়েক মিলি সেকেন্ডে চলে তবে এই খারাপ ক্যোয়ারী পরিকল্পনার সাহায্যে এটি 30+ সেকেন্ড সময় নেয়।

প্রোডাকশন ডাটাবেস সার্ভারে পুরো ক্যোয়ারী ক্যাশেটি উড়িয়ে না দিয়ে আমি কীভাবে সার্জিকভাবে এসকিউএল সার্ভার ২০০৮ থেকে কেবল একটি খারাপ ক্যাশেড ক্যোয়ারী পরিকল্পনা সরিয়ে ফেলব ?


উত্তর:


39

আমি কয়েকটি জিনিস বের করেছিলাম

select * from sys.dm_exec_query_stats

সমস্ত ক্যাশেড ক্যোয়ারী পরিকল্পনা প্রদর্শন করবে show দুর্ভাগ্যক্রমে, কোনও এসকিউএল পাঠ্য সেখানে প্রদর্শিত হয়নি।

তবে আপনি যেমন পরিকল্পনা তে এসকিউএল পাঠ্যে যোগদান করতে পারেন:

select plan_handle, creation_time, last_execution_time, execution_count, qt.text
FROM 
   sys.dm_exec_query_stats qs
   CROSS APPLY sys.dm_exec_sql_text (qs.[sql_handle]) AS qt

এখান থেকে WHEREআমার জানা এসকিউএল কোয়েরিতে রয়েছে তা সন্ধানের জন্য একটি ধারা যুক্ত করা বেশ তুচ্ছ , এবং তারপরে আমি কার্যকর করতে পারি:

DBCC FREEPROCCACHE (plan_handle_id_goes_here)

ক্যোয়ারী প্ল্যান ক্যাশে থেকে প্রতিটি ক্যোয়ারী পরিকল্পনা সরিয়ে ফেলতে। একেবারে সহজ বা সুবিধাজনক নয়, তবে এটি কাজ করে বলে মনে হচ্ছে ..

সম্পাদনা: পুরো ক্যোয়ারী ক্যাশে ফেলে ফেলাও কাজ করবে এবং এটি যত কম মনে হচ্ছে কম বিপজ্জনক, কমপক্ষে আমার অভিজ্ঞতায়:

DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;

2
একটি পরিকল্পনার ইঙ্গিতটি ব্যবহার করার পরামর্শটি কম নয়।
রিমাস রুসানু

1
আমার জিজ্ঞাসাটি ম্যাজিকালি এটির খারাপ পরিকল্পনাটি রিফ্রেশ করার পরে এটি পেয়েছিল তবে আমি পরের বার এটি পরীক্ষা করার পরিকল্পনা করছি। ক্যোয়ারী 'alচ্ছিক-itis' ভুগলে কোনও পরিকল্পনার ইঙ্গিতটি সহায়তা করে না - যেখানে এটিতে অনেকগুলি alচ্ছিক পরামিতি রয়েছে এবং এটি একটি সেটের জন্য অনুকূলিত করা হয়েছে, তারপরে একটি আলাদা সেটের জন্য রান করুন। এই জাতীয় ক্যোয়ারির জন্য কোনও অনুকূল পরিকল্পনা সংযুক্ত করা যায় না। প্যারামিটারগুলির একটি সেটের জন্য একটি অনুকূল পরিকল্পনা রয়েছে যা পরামিতিগুলির অন্য সেটগুলির জন্য ভয়াবহ আকার ধারণ করে।
নিক.এমসিডার্মাইড

6

আপনি যদি ভাল পরিকল্পনাটি দেখতে কেমন তা জানেন তবে কেবল একটি পরিকল্পনার ইঙ্গিতটি ব্যবহার করুন ।

আপনি একটি নির্দিষ্ট ক্যাশে এন্ট্রি সরাতে পারবেন না, তবে আপনি একটি সম্পূর্ণ ক্যাশে পুলটি সাফ করতে পারেন DBCC FREESYSTEMCACHE(cachename/poolname)

আপনার যদি খারাপ হ'ল ক্যোয়ারী পরিকল্পনার ক্যাশে নামটি পাওয়া যায় তবে আপনার যদি হ্যান্ডেল থাকে ( এক্সপ্লোরের সময় সমস্যার ক্ষেত্রে সেশন_আইডি থেকে sys.dm_exec_requests.plan_handle বা sys.dm_exec_query_stats পোস্ট এক্সিকিউশন থেকে):

select ce.name
from sys.dm_exec_cached_plans cp
join sys.dm_os_memory_cache_entries ce on cp.memory_object_address = ce.memory_object_address
where cp.plan_handle = @bad_plan

তবে সমস্ত এসকিউএল পরিকল্পনার নাম 'এসকিউএল প্ল্যানস' রয়েছে যা ডিবিসিসির জন্য নিখরচায় একটি সঠিক পছন্দ বাছাই করে তোলে ... কঠিন পছন্দ।

হালনাগাদ

কিছু নয়, ভুলে গেছি DBCC FREEPROCCACHE(plan_handle), হ্যাঁ এটি কার্যকর হবে।


1
ডিবিসিসি ফ্রিপ্রোসচাচে প্ল্যান-হ্যান্ডল পাস করার ক্ষমতা এসকিউএল সার্ভার ২০০৮ এ উপলব্ধ এবং এসকিউএল সার্ভার ২০০ 2005-এ উপলব্ধ নয়
মারিও

অর্থ কী যদি না sys.dm_exec_cached_plansতা কোন এন্ট্রি হয়েছে plan_handleথেকে sys.dm_exec_requests?
জোনাথন গিলবার্ট

@ জোনাথনগিলবার্ট এর অর্থ প্ল্যানটি ক্যাশে করা হয়নি, বা এটি ক্যাশে থেকে উচ্ছেদ করা হয়েছে। ডকস.মাইক্রোসফট.এইন
রিমাস রুসানু

সুতরাং কেবল তা নিশ্চিত করার জন্য, যদিও আমি কেবলমাত্র এই ক্যোয়ারীটি চালানো শুরু করেছি , এবং ক্যোয়ারিতে এটির ক্যাশে না করার কথা বলতে কোনও ইঙ্গিত নেই, এটি এসকেচ করা যেতে পারে কারণ এসকিউএল সার্ভার এটি ক্যাশে না করার জন্য মান সিদ্ধান্ত নিয়েছে? এটা হবে না কারণ এটি এখনও চলছে, তাই না? যদি এটি পরিকল্পনাটি ক্যাশে করার সিদ্ধান্ত নেয়, তবে কোয়েরিটি যে বিন্দুতে শুরু হয় সেখান থেকে ঠিক তখনই ক্যাশে যাবে ?
জোনাথন গিলবার্ট

1

FREEPROCCACHE সমাধান জরিমানা, কিন্তু এই কাজ করার একটি অধিক প্রত্যক্ষ ভাবে ব্যবহার করা বিকল্প (কম্পাইল) (উল্লেখ করেছে এটি একটি এসপি ছিল না) আপনার জন্য SQL স্ট্রিং, এই ইঞ্জিন বলে তার একটি একক ব্যবহারের পরিকল্পনা, কারণ সম্ভবত আপনি সন্দেহ প্যারামিটার স্নিফিং রয়েছে বা আপনার পরিসংখ্যান রান থেকে চালানো থেকে একেবারে পৃথক এবং আপনি এটির একটি খারাপ ক্যাশেড প্ল্যান সমস্যা সন্দেহ করছেন suspect

DECLARE @SQL NVARCHAR(4000)
SELECT @SQL = 'SELECT * FROM Table WHERE Column LIKE @NAME OPTION (RECOMPILE)'
EXEC sp_executesql @SQL, N'@NAME varchar(15)', 'MyName' 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.