হঠাৎ সঞ্চিত প্রকের জন্য ধীরগতির কার্যকর পরিকল্পনা


15

আমি একটা বিষয় যা আমরা SQL সার্ভার 2000 সঙ্গে ভোগ করছি আমরা একটি পরিমিতরূপে লেনদেনের ওয়েবসাইট হয় বোঝার চেষ্টা করছি এবং আমরা নামক একটি সঞ্চিত proc আছে sp_GetCurrentTransactionsযা customerID, এবং দুটি তারিখের গ্রহণ করে।

এখন তারিখগুলি এবং গ্রাহকের উপর নির্ভর করে এই ক্যোয়ারী শূন্য থেকে সারিতে থাকা সারিগুলিতে যে কোনও কিছুই ফিরিয়ে দিতে পারে।

সমস্যা: আমরা যা অভিজ্ঞতা পেয়েছি তা হ'ল হঠাৎ আমরা Execution Timeout Expiredএকটি নির্দিষ্ট ক্লায়েন্টের জন্য তারা বেশ কয়েকটি ত্রুটি (সাধারণত বা অনুরূপ) পেয়ে যাব যখন তারা সেই সঞ্চিত প্রোকটি কার্যকর করার চেষ্টা করে। সুতরাং আমরা কোয়েরিটি পরীক্ষা করি, এটি এসএসএমএসে চালিত করি এবং এটি দেখতে 30 এর বেশি লাগে। সুতরাং আমরা সঞ্চিত প্রকল্পটি পুনরায় কম্পাইল করে এবং -বাং- এটি এখন 300 মিমিগুলিতে চলে।

আমি এই বিষয়ে আমাদের ডিবিএর সাথে কথা বলেছি। তিনি আমাকে বলেছিলেন যে আমরা যখন সঞ্চিত প্রকল্পটি তৈরি করি তখন ডাটাবেসটি একটি কোয়েরি পরিকল্পনা তৈরি করে। তিনি বলেছিলেন যে সেগুলি পরামিতিগুলির সেটের জন্য এটি একটি ভাল পরিকল্পনা ছিল, তবে আপনি যদি এটিতে কোনও নির্দিষ্ট পরামিতি ফেলে দেন তবে পরিকল্পনাটি সেই ডেটাটির জন্য সেরা পরিকল্পনা হবে না এবং তাই আপনি এটি ধীরগতিতে দেখবেন।

আমার কাছে উপস্থাপিত বিকল্পগুলি হ'ল সমস্যাযুক্ত ক্যোয়ারীটি কোনও সঞ্চিত তদন্ত থেকে সরানো এবং ডায়নামিক এসকিউএল-এ ফিরে আসা যার প্রতিটি প্রয়োগে এটি কার্যকর করার পরিকল্পনা রয়েছে plan

এটি আমার কাছে ফিরে যাওয়ার মতো একটি অনুভূতি বলে মনে হয় এবং আমার মনে হয় এর আশেপাশে কোনও উপায় থাকতে হবে। এই সমস্যাটি মোকাবেলার জন্য কি অন্য কোনও উপায় আছে?

যে কোনও এবং সমস্ত প্রতিক্রিয়া প্রশংসা করা হয়।


প্রোকে একটি / অন্য বিবৃতি আছে? আমি যখন এই বিবৃতিতে পরিকল্পনাটি ক্যাশে হয়ে যায় তখন এটি ঘটতে দেখেছি এবং তারপরে ভুল পরিকল্পনা ব্যবহার করে অন্য ব্লকের অধীনে কার্যকর করার চেষ্টা করি। এই ত্রুটিগুলি কি প্রোচের পরিবর্তনের সাথে মিলছে?
জেরেমি গ্রে

@ জেরেমি: প্রোকের কোনও পরিবর্তন নেই এবং অন্য কোনও / যদি বিবৃতি না থাকে।
Ciaran আর্চার

উত্তর:


14

এই ইস্যুটিকে প্যারামিটার স্নিফিং বলা হয়।

এসকিউএল সার্ভারের পরবর্তী সংস্করণগুলি আপনাকে এর সাথে সম্পর্কিত OPTION (RECOMPILE)বা OPTIMIZE FORইঙ্গিতের মতো আরও বেশি বিকল্প দেয়।

আপনি স্টোরেজ পদ্ধতিতে ভেরিয়েবলগুলি ঘোষণার চেষ্টা করতে পারেন, ভেরিয়েবলগুলিকে প্যারামিটারের মানগুলি নির্ধারণ করে এবং প্যারামিটারগুলির স্থানে ভেরিয়েবলগুলি ব্যবহার করে যেমন মনে হয় আপনি বেশিরভাগ সময় যুক্তিসঙ্গতভাবে সন্তোষজনক পরিকল্পনা পেয়ে যাচ্ছেন।

সাধারণত সবচেয়ে বিপর্যয়কর খারাপ পরিকল্পনাগুলি হ'ল সেগুলি খুব উচ্চ নির্বাচনের সাথে পরামিতিগুলির জন্য সংকলিত হয় তবে কম নির্বাচনের সাথে পরামিতিগুলির সাথে দৌড়েছিল।

উত্পন্ন পরিকল্পনাটি এই পদ্ধতির সাথে আরও দৃust় এবং সমস্ত পরামিতি মানগুলির জন্য সন্তোষজনক তবে জেএনকে প্রস্তাবিত এই পদ্ধতির সুবিধা হ'ল এটি প্রতিটি কলের জন্য একটি সংকলন ব্যয় বহন করে না।

অসুবিধাটি হ'ল যে কোনও মৃত্যুদণ্ড কার্যকর করার জন্য সেই পরামিতি মানগুলির জন্য বিশেষত একটি পরিকল্পনার চেয়ে রান করার সময় বেশি হতে পারে সুতরাং এটি কার্যকর করার সময় বনাম সংকলনের সময় একটি বাণিজ্য।


3
অথবা ওরাকল পরিভাষায় "বাইন্ড পিকিং"
গাইউস

ধন্যবাদ @ গাইস, একাধিক আরডিবিএমএসের জন্য পরিভাষা জানা ভাল;)
আন্দ্রে রিনিয়া

6

ডায়নামিক এসকিউএল ব্যবহার করার পরিবর্তে, আপনি সর্বদা আপনার প্রক্স কলগুলিতে কেবল পরিবর্তন করতে পারেন:

EXEC Database.dbo.usp_Myprocedure 'Parameter' WITH RECOMPILE

WITH RECOMPILEবাহিনী (আপনি ঠিকই অনুমান!) মৃত্যুদন্ড পরিকল্পনা যখনই চালানো হয় একটি কম্পাইল।

আপনি WITH RECOMPILEসঞ্চিত প্রকল্পের সংজ্ঞাটিতে অন্তর্ভুক্ত করতে পারেন :

CREATE PROCEDURE usp.MyProcedure (Parameters)
WITH RECOMPILE
AS
...

2

আপনি যে ডাটাবেসটি ব্যবহারের পরিকল্পনা করছেন তার সিদ্ধান্ত নেওয়ার চেষ্টাও করতে পারেন, যদিও আপনি অপটিমাইজারের সাথে কিছুটা লড়াই করছেন, সুতরাং আপনারা আশা করার চেয়ে এটি আরও ভঙ্গুর।

কৌশলটি হ'ল - সঞ্চিত পদ্ধতিটিকে 2 ভাগে ভাঙ্গা করুন, যার অর্থ একটি পরামিতিগুলির একটি সেট, অন্যটির জন্য। এগুলির মধ্যে প্রতিটি যেখানে এমন সম্ভাব্য মামলাগুলি কভার করে সেগুলিতে ক্লজ যুক্ত করুন। ক্যোয়ারী পরিকল্পনাগুলি দেখুন - একটিকে পরামিতিগুলির একটি সেটের জন্য অপ্টিমাইজ করা উচিত, অন্যটি অন্য সেটটির জন্য। এটি হওয়ার জন্য আপনাকে কোয়েরিতে টিঙ্কার লাগতে পারে, বা আপনার ক্যোয়ারির জন্য এটি অর্জন করা সম্ভব নয়, এক্ষেত্রে এই পদ্ধতির কাজ হবে না।

এখন আপনার আসল সঞ্চিত পদ্ধতিটিকে প্যারামিটারের মানগুলি পরীক্ষা করে আগের প্যারাগ্রাফ থেকে দুটি সঞ্চিত পদ্ধতির উপযুক্ত একটিতে প্রেরণ করুন।

এটি কাজ করতে পারে তবে আপনার কোয়েরির জন্য অপ্টিমাইজারকে আরও কার্যকরভাবে কাজ করতে বাধ্য করার জন্য এটি হ্যাকের মতো। এই জাতীয় সমস্ত হ্যাকের মতো, ভবিষ্যতের ডাটাবেসের সংস্করণগুলিতে এটি অপ্রয়োজনীয় হতে পারে বা আরও খারাপ হতে পারে। সুতরাং এটি কাজ করে এমনকি যদি আপনাকে এটির মূল্য হয় তবে সিদ্ধান্ত নিতে হবে।


1

আপনি SET FORCEPLANইঙ্গিতগুলিও চেষ্টা করে দেখতে পারেন ।

http://msdn.microsoft.com/en-us/library/ms188344.aspx
এটি মূলত আপনাকে কী অর্ডারে যোগ দেয় তা চয়ন করতে দেয়।

এসকিউএল সার্ভারটি সঠিক সূচকগুলি ব্যবহার করে তা নিশ্চিত করার জন্য আপনার সূচক ইঙ্গিত থাকতে পারে।


0

হুম ... আমরা যদি কেবল এই একটি সংরক্ষণ করা পদ্ধতিতে মনোনিবেশ করি তবে আমি অবাক হব যে ক্যাশেড এক্সিকিউশন প্ল্যানটি ব্যবহার করা আপনি যে সমস্যার মুখোমুখি হচ্ছেন সেটি সৃষ্টি করবে। আমি গ্রাহকের জন্য পরামিতিগুলির একটি সেট এবং দুটি তারিখ ব্যবহার করে সঞ্চিত প্রক্রিয়াটির বাস্তবায়ন পরিকল্পনাটি দেখতে বলব would আমি ভাবছি যদি আরও নির্দিষ্ট সূচি সহায়ক হয় -> যেমন গ্রাহকআইডি তে এবং কেবল দুটি তারিখ?


2
কেন অবাক? এই লক্ষণগুলির সাথে পরামিতি স্নিফিং মোটামুটি সাধারণ সমস্যা এবং এটি দেখতে ডিবিএ সমস্যা হিসাবে চিহ্নিত করেছে বলে মনে হচ্ছে।
মার্টিন স্মিথ

@ মার্টিনস্মিত - আমি একটু অবাক হয়েছি যে ডিবিএ যে পরামিতি স্নিফিংয়ের বিষয়ে জানে তা পুনঃসংশোধনের ইঙ্গিত সম্পর্কে জানে না যদিও ...
জেএনকে

@ জেএনকে - সত্য। তারা কেন এটি উল্লেখ করবেন না তা নিশ্চিত নয়।
মার্টিন স্মিথ

0

হঠাৎ করে হতাশার পারফরম্যান্সটি এমন একটি অকার্যকর ক্যোয়ারী পরিকল্পনার মতো শোনাচ্ছে যা সম্ভবত প্রকাশিত পরিসংখ্যানের ফলাফল হিসাবে তৈরি হয়। "ত্রুটি এবং সতর্কতা" ইভেন্ট বিভাগ সেট করে একটি এসকিউএল সার্ভার প্রোফাইলার চালনা করুন এবং অনুপস্থিত পরিসংখ্যান সম্পর্কে সতর্কতা আছে কিনা তা দেখুন।

আপনি একটি সূচকও মিস করতে পারেন, বা আপনাকে সূচীগুলি ডিফ্র্যাগ করতে হতে পারে কারণ এসকিউএল সার্ভারটি ব্যবহার করার জন্য এটি খুব বেশি খণ্ডিত হতে পারে, ফলস্বরূপ যে টেবিল স্ক্যানটি কম আই / ও তৈরি করবে এই ভেবে এই ফলস্বরূপ।

@ জেএনকে সঞ্চিত প্রকোস সম্পর্কে একটি দুর্দান্ত পয়েন্ট উত্থাপন করেছে - এগুলি সামনের দিকে সংকলিত হয়ে যায় এবং সন্ধানের পদ্ধতির পাশাপাশি ক্যোয়ারী পরিকল্পনা সংরক্ষণ করা হবে।

সুপারিশের সাথে ব্যবহার করার সাথে অগত্যা আমি একমত নইআপনি পুনরায় ব্যবহারের জন্য ক্যোয়ারী পরিকল্পনার সুবিধাটি হারাতে চাইলে । কিছু ক্ষেত্রে রয়েছে যখন এটি প্রয়োজনীয় - যেমন অন্তর্নিহিত টেবিলগুলিতে আপনার বিতরণের পরিসংখ্যানগুলি কলগুলির মধ্যে খুব বেশি পার্থক্য করে তবে সাধারণত, একবার টেবিলগুলির মধ্যে ডেটা পরিপক্ক হয়ে গেলে, টেবিলের মধ্যে ডেটা বিতরণ ন্যূনতমভাবে পরিবর্তিত হয়।

সুতরাং, সংক্ষেপে বলা:

  1. অনুপস্থিত পরিসংখ্যান পরীক্ষা করুন
  2. সূচী বিভাজন পরীক্ষা করুন
  3. একটি সঞ্চিত প্রকল্প তৈরি এবং ব্যবহার করুন
  4. অনুগ্রহ করে প্রকের নাম পরিবর্তন করুন - এসপিএলটি অভ্যন্তরীণ সিস্টেম এসকিউএল সার্ভার প্রোক্সের জন্য একটি নরমভাবে সংরক্ষিত উপসর্গের নেমস্পেস - এর ফলে এসকিউএল সার্ভার সর্বদা প্রথমে সঞ্চিত প্রক্রিয়াগুলির জন্য মাস্টার ডাটাবেসের সন্ধান করে। এসপি_র পরিবর্তে ইউএসপি_র নাম পরিবর্তনের ফলে কর্মক্ষমতা বৃদ্ধি পাবে, তবে আমি সন্দেহ করি যে এটি ক্ষেত্রে আপনার সমস্যা।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.