Sp_executesql কখন ক্যোয়ারী প্ল্যান রিফ্রেশ করে?


13

আমি আমার নির্দোষকে ক্ষমা করতে হবে কারণ আমি ডিবিএ নই তবে আমার বুদ্ধি হ'ল সময়ের সাথে সাথে কোয়েরি পরিকল্পনাটি সর্বশেষ পরিসংখ্যানের সাথে আপডেট রাখার জন্য পুনরায় সংকলন করতে হবে।

ধরে নিচ্ছি আমার আমার ডাটাবেসে একটি সঞ্চিত প্রক্রিয়া রয়েছে যা কিছু নিয়মিত বিরতিতে সর্বশেষ পরিসংখ্যানের বিরুদ্ধে পুনরায় সংকলিত হয়, কোডে সঞ্চিত পদ্ধতিটি সাইন ইন করার এবং এটি একটি sp_executesqlবিবৃতিতে মোড়ানোর কী কী প্রভাব পড়বে ? পদ্ধতিটির পুনঃসংশোধনের অংশ হিসাবে যে ক্যোয়ারী প্ল্যানটি ঘটেছিল তা কি আমি রিফ্রেশ হারিয়েছি?

এই পরিবর্তন করার আগে যদি আমার আর কিছু বিবেচনা করা (অনুমতি ব্যতীত) থাকে তবে আমি আপনার অন্তর্দৃষ্টি প্রশংসা করব।

আমি এমএসডিএন এ পড়েছি:

বিদ্যমান এক্সিকিউশন পরিকল্পনার সাথে নতুন ট্রানস্যাক্ট-এসকিউএল স্ট্রিংয়ের সাথে মিল করার জন্য এসকিউএল সার্ভার ক্যোয়ারী অপ্টিমাইজারের ক্ষমতাটি স্ট্রিংয়ের পাঠ্যে ক্রমাগত পরিবর্তনশীল প্যারামিটার মানগুলি বাধাগ্রস্থ করে, বিশেষত জটিল ট্রানজেক্ট-এসকিউএল বিবৃতিগুলিতে।

সুতরাং সঞ্চিত পদ্ধতিটি ধরে রেখে আমি ইন-লাইন এবং মোড়ানোর চেষ্টা করছি sp_executesqlতাতে আসলে কিছু প্যারামিটার থাকে না, এটি কি বলছে যে যদিও আমার মৃত্যুদন্ড কার্যকর করার পরিকল্পনাটি করা হয়েছে তবে এসকিউএল সার্ভারের এটি সন্ধান এবং পুনরায় ব্যবহার করা আমি আরও কঠিন করে দিচ্ছি?

উত্তর:


7

এমএসডিএন থেকে প্রাপ্ত লাইনটি ব্যবহারের বিষয়ে কথা বলছে EXEC():

SET @sql = 'SELECT foo FROM dbo.bar WHERE x = ''' + @x + ''';';
EXEC(@sql);

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

আপনি যদি ব্যবহার করেন sp_executesqlতবে প্যারামিটার মানগুলি এখনও প্যারামিটার স্নিফিংয়ের সমস্যা তৈরি করতে পারে (ঠিক যেমন সাধারণ এসকিউএল এর মতো), তবে এসকিউএল সার্ভার পরিকল্পনাটি পুনরায় ব্যবহার করতে পারে কিনা এর সাথে এর কোনও যোগসূত্র নেই। এই পরিকল্পনাটি বার বার ব্যবহার করা হবে, ঠিক যেমন আপনি একেবারেই ব্যবহার sp_executesqlকরেন নি , যদি না ভেরিয়েবলগুলি যার ফলে সরাসরি কোয়েরিটি পুনরায় সংমিশ্রিত হয়, তবে এই ক্ষেত্রে এটি আবারও সংমিশ্রিত হয়ে যায় (মূলত, এসকিউএল সার্ভারটি করে না পরিকল্পনার সাথে যে কোনও কিছু সংরক্ষণ করুন যা বলে যে "এটি sp_executesql থেকে কার্যকর করা হয়েছিল, তবে এটি একটি হয়নি):

SET @sql = N'SELECT foo FROM dbo.bar WHERE x = @x;';
EXEC sp_executesql @sql, N'@x VARCHAR(32)', @x;

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

আপনি পরিকল্পনা পুনরায় ব্যবহার এবং / অথবা পরামিতি আঘ্রাণ সমস্যা হয়ে থাকে, তাহলে কিছু জিনিস আপনি মধ্যে হওয়া উচিত হয় OPTION (RECOMPILE), OPTIMIZE FOR, optimize for ad hoc workloadsএবং simple/forced parameterization। আমি এখানে একটি সাম্প্রতিক ওয়েবকাস্টের প্রতিক্রিয়া হিসাবে অনুরূপ কয়েকটি প্রশ্নের উদ্দেশ্যে সম্বোধন করেছি, এটি একটি স্কিমের মূল্য হতে পারে:

http://sqlperformance.com/performance-palooza

সংক্ষিপ্তসারটি হ'ল: ব্যবহার করতে ভয় পাবেন না sp_executesql, কেবল যখন আপনার প্রয়োজন হবে তখনই এটি ব্যবহার করুন এবং যখন আপনার আসল পারফরম্যান্সের সমস্যা থাকে তখন কেবলমাত্র এটিকে অতিরিক্ত অনুকূলকরণের জন্য ব্যয় করুন। উপরের উদাহরণটি ভয়াবহ একটি কারণ এখানে ডায়নামিক এসকিউএল ব্যবহার করার কোনও কারণ নেই - আপনার বৈধ ব্যবহারের মামলা রয়েছে বলে ধরে নিয়ে আমি এই উত্তরটি লিখেছি।


2

Sp_executesql এর মাধ্যমে পরিচালিত ক্যোয়ারীগুলি সম্পাদনা পরিকল্পনার একই নিয়মগুলি সাধারণ ক্যোয়ারী হিসাবে অনুসরণ করে যা sp_executesql এর মাধ্যমে চালিত হয় না। যদি ক্যোয়ারির পাঠ্য পরিবর্তন হয় তবে একটি নতুন পরিকল্পনা তৈরি করা হবে। পরামিতি ব্যবহারকারীর কারণে যদি পাঠ্যটি পরিবর্তন না হয় তবে পরিকল্পনাটি পুনরায় ব্যবহার করা হবে। যখন পরিসংখ্যান আপডেট করা হয় তখন পরিকল্পনার মেয়াদ শেষ হয়ে যায় এবং পরবর্তী সময় ক্যোয়ারি চালানোর সময় নতুন পরিকল্পনা তৈরি করা হয়।


আপনার উত্তরের জন্য ধন্যবাদ, আমি প্যারামিটারগুলি সম্পর্কে একটি সম্পাদনা করেছি কারণ আমি এখন বুঝতে পেরেছি যে আমি যখনই sp_ExecuteSql কল করি তখন আমি এসকিউএল সার্ভারের দৃষ্টিকোণ থেকে, প্রতিস্থাপন করেছি এই কারণে ক্যোয়ারী হিসাবে আলাদা স্ট্রিং ব্যবহার করব will হার্ড কোডিং মান সহ পরামিতিগুলি (এসকিউএল সার্ভারে আমার ক্যোয়ারী প্রেরণের আগে তারা কোড ইনপুট হবে)। আপনি কি এই কাছাকাছি উপায় জানেন? আমার ইন-লাইন এসকিএল স্টেটমেন্টে ভেরিয়েবলগুলি ঘোষিত করা কি ক্যোয়ারী অপ্টিমাইজারকে আমার ক্যাশেড ক্যোয়ারী প্ল্যানটি আবিষ্কার করতে সহায়তা করবে?
জেমস লুইস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.