আমি কীভাবে অ্যাজুরে এসকিউএল ডেটাবেস থেকে খারাপ প্রয়োগের পরিকল্পনাটি সরিয়ে ফেলতে পারি?


12

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

(উত্সটি খারাপ সূচীগুলি ছিল -> খারাপ পরিসংখ্যান ইত্যাদি That's এগুলি সব ঠিক আছে তবে একটি খারাপ পরিকল্পনা চলে না))

আপডেট: আমি প্রথমে @ mrdenny এর সমাধানটি বেছে নিয়েছি। আমি যাইহোক, কাজটি সম্পাদন করতে সফলভাবে @ অ্যারন বার্ট্র্যান্ডের স্ক্রিপ্টটি ব্যবহার করছি। সহায়তার জন্য প্রত্যেককে ধন্যবাদ !!


আপনি Azure একটি sp_recompile করতে পারেন?
mrdenny

হ্যাঁ. ঠিক কীভাবে আমি এটি চালিয়ে যাব? আমাদের কাছে কোনও স্টকড প্রোকস নেই। এটি গতিশীল এসকিউএল চালিত হয় sp_executesql
জ্যাক্সিডিয়ান

2
আপনি এটি টেবিলে নিজে চালাতে পারেন এবং সেই টেবিলটি ব্যবহার করে এমন পরিকল্পনাগুলি ফ্ল্যাশ করা উচিত। (যদি এটি কাজ করে তবে আমি এটিকে উত্তর দিয়ে দেব))
mrdenny

1
আমি এটি কেবল একটি টেবিলে চেষ্টা করেছি এবং প্রক্রিয়া করার সময় এটি টেবিলটিকে একটি লেনদেনের মধ্যে স্পষ্টতই লক করে দেয়। আমি এটি কেবল 24 টি রেকর্ড সহ 10-কলামের টেবিলটিতে চেষ্টা করেছি এবং এটি শেষ হতে এক মিনিটের বেশি সময় লেগেছে। এই সময়ে, আমি টেবিলটি জিজ্ঞাসা করতে পারিনি। প্রোডাকশনের আমাদের আসল টেবিলগুলিতে আমি এর মতো কিছু চালাতে পারি না!
জ্যাক্সিডিয়ান

1
জঘন্য, এটি একটি গুঁড়ো। দেখে মনে হচ্ছে আপনার কোনও স্ক্রিম পরিবর্তন করতে হবে যেমন একটি নালামযোগ্য কলাম যুক্ত করার পরে এটি ফেলে দিন। এটি পাশাপাশি ক্যাশে মুছে ফেলবে এবং তাড়াতাড়ি হওয়া উচিত। পরীক্ষা অবশ্যই নিশ্চিত করে বলবে।
mrdenny

উত্তর:


12

অ্যাজুর এসকিউএল এখন সরাসরি এটি সমর্থন করে

অ্যাজুর এসকিউএল ডেটাবেস সরাসরি কোনও ব্যবহারকারী ছাড়াই বর্তমান ব্যবহারকারীর ডাটাবেসের প্রোচ ক্যাশে সাফ করার জন্য সমর্থন করে:

ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

অতিরিক্ত তথ্য

নিম্নলিখিত স্ক্রিপ্টটি ( শ্যানন গোয়েন দ্বারা ) প্রক্রিয়াটি পর্যায়ক্রমে দেখার জন্য ব্যবহার করা যেতে পারে:

-- run this script against a user database, not master
-- count number of plans currently in cache
select count(*) from sys.dm_exec_cached_plans;

-- Executing this statement will clear the procedure cache in the current database, which means that all queries will have to recompile.
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

-- count number of plans in cache now, after they were cleared from cache
select count(*) from sys.dm_exec_cached_plans;

-- list available plans
select * from sys.dm_exec_cached_plans;

আমি এটি এখনও চেষ্টা করি নি তবে এটি যদি বাস্তবে কার্যকর হয় তবে 2017 সালের শুরু হিসাবে এটি সম্ভবত "সেরা" উত্তর। এর জন্য ধন্যবাদ - আমার এখানে কোনও ধারণা ছিল না! :-)
জ্যাক্সিডিয়ান

আমি এটি চেষ্টা করেছি (একটি প্রিমিয়াম ডিবিতে) এবং এটি কার্যকর হয়েছে।
রেমি লেমারচাঁদ

আমি এটি আপডেট হওয়া "স্বীকৃত উত্তর" হিসাবে পতাকাঙ্কিত করেছি তবে আমি নিজেই এটি পরীক্ষা করে দেখিনি। আমি এটি সরাসরি টড এবং রেমির প্রতিক্রিয়ায় ভিত্তি করছি। সবাইকে ধন্যবাদ!
জ্যাক্সিডিয়ান

কেবল পুনরায় দেখার জন্য, আমি এটি ব্যবহার করেছি এবং এটি আমার পক্ষে ভাল কাজ করেছে! আমি এখানে সমৃদ্ধ করতে টডের উত্তরে কিছু অতিরিক্ত স্ক্রিপ্ট যুক্ত করছি তবে তার পোস্টটি পেরেকটি মাথার উপরে আঘাত করেছে।
জ্যাক্সিডিয়ান

এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে না - এটি কেবল কার্যকর করে তবে তালিকাগুলি এখনও পূর্ণ - আমি এসকিউএল অ্যাজুরিতে রয়েছি - কী ভুল হতে পারে?
ডার্ক বোয়ার

12

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

এর জন্য ক্রেডিট খুঁজছেন না, তবে একাধিক টেবিলের বিপরীতে একই ক্রিয়াকলাপ সম্পাদন করতে গতিশীল এসকিউএল তৈরি করা বেশ সহজ:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'ALTER TABLE '
  + QUOTENAME(SCHEMA_NAME([schema_id])) 
  + '.' + QUOTENAME(name) + ' ADD fake_column INT NULL;
  ALTER TABLE ' 
  + QUOTENAME(SCHEMA_NAME([schema_id]))
  + '.' + QUOTENAME(name) + ' DROP COLUMN fake_column;'
FROM sys.tables
--WHERE name IN, LIKE, etc.

PRINT @sql;

-- if the command > 8K, you can see the second chunk e.g.

PRINT SUBSTRING(@sql, 8001, 8000);

--EXEC sys.sp_executesql @sql;

(আমি এই "গতিশীল এসকিউএল এর দৈর্ঘ্য" ইস্যু সম্পর্কে একটি টিপ লিখেছি ...)


আমার ক্ষেত্রে, তাদের সমস্তকে সরিয়ে ফেলা সেখানে খারাপ জিনিসগুলিকে রেখে দেওয়া ভাল। সতর্ক থাকুন জন্য ধন্যবাদ। আমি জানি আপনি আমাকে বৈশিষ্ট্যগুলি বলতে পারবেন না তবে আপনি কি আমাকে বলতে পারবেন যখন আপনি যে বিষয়গুলি নিয়ে কথা বলতে পারবেন না সে সম্পর্কে কথা বলতে বাধা দেওয়া হবে না? ;-)
জ্যাক্সিডিয়ান

এটিও শ্রেণিবদ্ধ, দুঃখিত। :-)
অ্যারন বারট্রান্ড

আপনি লিঙ্কটি বলতে চাইছেন তা নিশ্চিত নয়। আমি যা বোঝাতে চাইছিলাম তা হল আপনার nvarchar(max)পরিবর্তনশীল 4000 অক্ষর, 8000 অক্ষরের পরে সীমাবদ্ধ করে যদি আমি এটিকে পরিবর্তন করি varchar(max)। ঠিক সেই স্ক্রিপ্ট চলছে। আমাদের কাছে 450 ডলারের টেবিল রয়েছে, তাই আমরা সহজেই তা হিট করি (30 ডলার সারণী) varchar(max)বৈধ বাক্য গঠন, এটি কেবল অভিন্ন varchar(8000)এবং এর nvarchar(max)সাথে অভিন্ন nvarchar(4000)
জ্যাক্সিডিয়ান

3
হ্যাঁ, আপনি যখন PRINTআদেশ দিন, এটি কেবল 8000 বাইট দেখায়। এটি PRINTআদেশের একটি সীমাবদ্ধতা , আজুর নয়। আপনি যদি কমান্ডটি চালান তবে এটি কাজ করবে এমনকি আপনি দৃশ্যত পুরো বিষয়টি পরীক্ষা করতে না পারলেও।
অ্যারন বারট্র্যান্ড

... দোহ, দুঃখিত, আমি মনে করি আপনি ঠিক বলেছেন! আমাকে সংশোধন করার জন্য ধন্যবাদ! আপনার স্ত্রী যখন 25 মিনিট আগে আপনার চলে যাওয়ার প্রত্যাশা করছিলেন তখনই এটি ঘটে ... ;-) এই লিপিটি আমার পক্ষে নিখুঁতভাবে কাজ করে!
জ্যাক্সিডিয়ান

6

টেবিলটিতে একটি অবিচ্ছেদ্য কলাম যুক্ত করুন এবং তারপরে কলামটি ড্রপ করুন। এটি এসকিউএলকে সেই বস্তুর জন্য ক্যাশে ফ্লাশ করতে বাধ্য করবে।

সমস্ত টেবিলগুলি করার জন্য, একটি কার্সারটি কৌশলটি করা উচিত। কেবল একটি কলামের নাম ব্যবহার করুন যা 'zzzzzz_go_away' বা কোনও কিছুর মতো কোনও টেবিলের মধ্যে কখনও উপস্থিত থাকবে না।


4

অ্যাজুর এসকিউএল ডেটাবেস বর্তমানে সমর্থন করে না DBCC FREEPROCCACHE, সুতরাং আপনি ম্যানুয়ালি ক্যাশে থেকে একটি কার্যকরকরণ পরিকল্পনা সরাতে পারবেন না। তবে, আপনি যদি কোনও টেবিলে পরিবর্তন করেন বা কোয়েরি ( ALTER TABLE/ ALTER VIEW) দ্বারা রেফারেন্স দেখেন তবে পরিকল্পনাটি ক্যাশে থেকে সরানো হবে। ( রেফারেন্স ।)


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

1
আপনি সম্ভবত একটি ডামি কলাম যুক্ত করতে পারেন এবং তারপরে এটি ফেলে দিতে পারেন। এটি পরিকল্পনাটি ক্যাশে থেকে সরিয়ে ফেলবে। টেবিলটি কত বড়?
কিন শাহ

এটিই সমাধান হিসাবে শেষ হয়েছিল, যেমন @ মির্দেনি প্রস্তাবিত। সাহায্যের জন্য ধন্যবাদ!! :-)
জ্যাক্সিডিয়ান

1
ধন্যবাদ ... সময় মাত্র কয়েক সেকেন্ড .. স্ট্যাকেক্সচেঞ্জের কিছু অন্য পোস্টের উত্তর দিচ্ছিল ...
কিন শাহ

1

সমস্ত কার্যকরকরণ পরিকল্পনা সাফ করতে, এটি ব্যবহার করুন:

    SET NOCOUNT ON

DECLARE @lcl_name VARCHAR(100)
DECLARE @addcolumnSql nVARCHAR(MAX)
DECLARE @dropcolumnSql nVARCHAR(MAX)

DECLARE cur_name CURSOR FOR
SELECT name
FROM sysobjects
WHERE type = 'U'
OPEN cur_name
FETCH NEXT FROM cur_name INTO @lcl_name
WHILE @@Fetch_status = 0
BEGIN
set @addcolumnSql = 'alter table [' + @lcl_name + '] add temp_col_to_clear_exec_plan bit'
EXEcute sp_executesql @addcolumnSql
print @addcolumnSql
set @dropcolumnSql = 'alter table [' + @lcl_name + '] drop column temp_col_to_clear_exec_plan'
EXEcute sp_executesql @dropcolumnSql
print @dropcolumnSql
--  EXEC (@lcl_name )
FETCH NEXT FROM cur_name INTO @lcl_name
END
CLOSE cur_name
DEALLOCATE cur_name
SET NOCOUNT OFF

আপনি যদি কোনও টেবিল পরিবর্তন করেন বা এটি উল্লেখ করে দেখুন, কার্যকর করার পরিকল্পনা সাফ হয়ে যায়।

একটি বিট আরো এখানে ব্যাখ্যা http://christianarg.wordpress.com/2013/08/22/remove-execution-plans-from-the-procedure-cache-in-sql-azure/

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