প্রস্তুত এসকিউএল ব্যাচ কার্যকরভাবে পৃথক করে একটি এসকিউএল ব্যাচ প্রস্তুত করা এমন একটি গঠন যা কার্যকরভাবে কার্যকর **এসকিউএল সার্ভারের জন্য অকেজো যে কার্যকর প্রয়োগগুলি ক্যাশে হয় তা দেওয়া হয়। প্রস্তুতির পদক্ষেপগুলি পৃথক করে (পার্সিং করা, কোনও প্যারামিটার বাঁধাই, এবং সংকলন) এবং প্রয়োগ যখন কেবল কোনও ক্যাশে নেই তখনই কার্যকর হয়। উদ্দেশ্য হ'ল একটি বিদ্যমান পরিকল্পনা পুনরায় ব্যবহার করে পার্সিং এবং সংকলনের জন্য ব্যয় করা সময় সাশ্রয় করা এবং এটি অভ্যন্তরীণ পরিকল্পনা ক্যাশেটি করে। তবে সমস্ত আরডিবিএমএসই এই স্তরটি ক্যাচিং করে না (স্পষ্টভাবে এই ফাংশনগুলির অস্তিত্ব থেকে) এবং তাই কোনও প্ল্যান "ক্যাশেড" হওয়ার অনুরোধ করার জন্য ক্লায়েন্ট কোডে ছেড়ে দেওয়া হয়েছে, এবং সেই ক্যাশে আইডি সংরক্ষণ করুন এবং তারপরে পুনরায় ব্যবহার করুন এটা। এটি ক্লায়েন্ট কোডে অতিরিক্ত বোঝা (এবং প্রোগ্রামার এটি করা এবং এটি সঠিকভাবে মনে করার জন্য) এটি অপ্রয়োজনীয়। আসলে, IDbCommand.Prepare () পদ্ধতির জন্য MSDN পৃষ্ঠাতে বলা হয়েছে:
সার্ভারটি স্বয়ংক্রিয়ভাবে পুনঃব্যবহারের পরিকল্পনা হিসাবে প্রয়োজনীয় হিসাবে ক্যাশে করে; অতএব, আপনার ক্লায়েন্ট অ্যাপ্লিকেশনে সরাসরি এই পদ্ধতিটি কল করার দরকার নেই।
এটি লক্ষ্য করা উচিত যে, যতক্ষণ আমার টেস্টিং শোতে (যা আপনি প্রশ্নের মধ্যে যা দেখায় তার সাথে মেলে), স্কেলকম্যান্ড.প্রিজার () কে কল করে কোনও "অপারেশন" করেন না - এটি কেবল এসপিএলপ্রেমিককে কল করে যা এসকিউএল প্রস্তুত করে এবং কার্যকর করে calls ; এটি sp_prepare কল করে না যা পার্স এবং কেবল সংকলন করে (এবং কোনও প্যারামিটার মান গ্রহণ করে না, কেবল তাদের নাম এবং ডেটাটাইপগুলি)। অতএব, কল করার কোনও "প্রাক-সংকলন" সুবিধা থাকতে পারে না SqlCommand.Prepare
কারণ এটি তাত্ক্ষণিকভাবে কার্যকর করা হয় (ধরে নিই লক্ষ্যটি কার্যকর করা স্থগিত করা)। যাইহোক , কল করার একটি আকর্ষণীয় সম্ভাব্য সামান্য সুবিধা রয়েছে SqlCommand.Prepare()
, এমনকি যদি এটি sp_prepexec
পরিবর্তে কল করে sp_prepare
। দয়া করে নোটটি দেখুন (** ) বিস্তারিত জানার জন্য নীচে।
আমার পরীক্ষাটি দেখায় যে এমনকি যখন SqlCommand.Prepare()
কল করা হয় (এবং দয়া করে মনে রাখবেন যে এই কলটি এসকিউএল সার্ভারে কোনও আদেশ দেয় না ), ExecuteNonQuery
বা ExecuteReader
এরপরে সম্পূর্ণরূপে কার্যকর করা হয় এবং যদি এটি এক্সিকিউটরিডার হয় তবে এটি সারিগুলি প্রদান করে। তবুও, এসকিউএল সার্ভার প্রোফাইলার দেখায় যে SqlCommand.Execute______()
কল করার পরে প্রথম কলটি SqlCommand.Prepare()
"এসকিউএল প্রস্তুত করুন" ইভেন্ট .Execute___()
হিসাবে নিবন্ধিত হয় এবং পরবর্তী কলগুলি "এক্সিকিউট রেডিয়ারড এসকিউএল" ইভেন্ট হিসাবে নিবন্ধিত হয়।
পরীক্ষার কোড
এটি পেস্টবিনে আপলোড করা হয়েছে: http://pastebin.com/Yc2Tfvup এ । কোডটি একটি .NET / C # কনসোল অ্যাপ্লিকেশন তৈরি করে যা এসকিউএল সার্ভার প্রোফাইলার ট্রেস চলাকালীন চলমান (বা একটি বর্ধিত ইভেন্টস সেশন) চালানোর উদ্দেশ্যে তৈরি হয়েছিল। এটি প্রতিটি পদক্ষেপের পরে বিরতি দেয় তাই কোন বিবৃতিতে একটি বিশেষ প্রভাব আছে তা স্পষ্ট হবে।
হালনাগাদ
কল করা এড়াতে আরও তথ্য এবং সামান্য সম্ভাব্য কারণ খুঁজে পেয়েছে SqlCommand.Prepare()
। আমি আমার পরীক্ষায় একটি জিনিস লক্ষ্য করেছি এবং সেই কনসোল অ্যাপ্লিকেশন চালাচ্ছিল যে কারও জন্য কী দ্রষ্টব্য হওয়া উচিত: কোনও স্পষ্ট কল কখনও হয় নি sp_unprepare
। আমি কিছু খনন করেছি এবং নিম্নলিখিত পোস্টটি এমএসডিএন ফোরামে পেয়েছি:
স্কেলকম্যান্ড - প্রস্তুতি নেবে নাকি প্রস্তুতি নেই?
গৃহীত উত্তরে তথ্যের একগুচ্ছ রয়েছে, তবে মূল বিষয়গুলি হ'ল:
- ** আসলে কী প্রস্তুতি আপনাকে রক্ষা করে তা মূলত তারের উপর দিয়ে ক্যোয়ারী স্ট্রিং প্রেরণ করতে সময় নেয়।
- প্রস্তুত ক্যোয়ারিতে ক্যাশেড প্ল্যানটি সংরক্ষণের কোনও গ্যারান্টি নেই এবং এটি সার্ভারে পৌঁছে একবার অ্যাড-হক ক্যোয়ারির চেয়ে দ্রুত হয় না।
- আরপিসির (কমান্ডটাইপ.স্টোরড প্রসেসর) প্রস্তুতি থেকে কিছুই লাভ হয় না।
- সার্ভারে, প্রস্তুত হ্যান্ডেলটি মূলত ইনএস-মেমরির একটি সূচক যা চালানোতে টিএসকিউএল ধারণ করে।
- মানচিত্রটি প্রতি সংযোগের ভিত্তিতে সংরক্ষণ করা হয়েছে, কোনও ক্রস-সংযোগ ব্যবহার সম্ভব নয়।
- ক্লায়েন্টটি পুল থেকে সংযোগটি পুনরায় ব্যবহার করে মানচিত্রকে সাফ করে দিলে রিসেটটি প্রেরণ করা হয়।
আমি এসকিউএলএকেট টিমের নিম্নলিখিত পোস্টটিও পেয়েছি, যা সম্পর্কিত বলে মনে হচ্ছে, তবে এটি কেবল ওডিবিসি সম্পর্কিত একটি সমস্যা হতে পারে যেখানে স্কেলক্লিয়েন্টটি স্কেলক্লিকেশনটি নিষ্পত্তি করার সময় সঠিকভাবে পরিষ্কার করে দেয়। এটি বলা শক্ত যেহেতু এসকিউএলএকেট পোস্টে কোনও অতিরিক্ত পরীক্ষার কথা উল্লেখ করে না যা এটি কারণ হিসাবে প্রমাণ করতে সহায়তা করবে যেমন সংযোগ পুল সাফ করা ইত্যাদি help
প্রস্তুত এসকিউএল বিবৃতি দেখুন
উপসংহার
দেত্তয়া আছে:
- কল করার একমাত্র আসল উপকারিতা
SqlCommand.Prepare()
মনে হয় আপনার আবার নেটওয়ার্কের মাধ্যমে ক্যোয়ারী পাঠ্য জমা দেওয়ার দরকার নেই,
- কলিং
sp_prepare
এবং sp_prepexec
সংযোগ স্মৃতিতে অংশ হিসেবে ক্যোয়ারী টেক্সট সংরক্ষণ (অর্থাত SQL সার্ভার মেমরি)
আমি কল করার বিরুদ্ধে সুপারিশ করব SqlCommand.Prepare()
কারণ একমাত্র সম্ভাব্য সুবিধা হ'ল নেটওয়ার্ক প্যাকেটগুলি সংরক্ষণ করা হয় যখন ডাউনসাইড আরও সার্ভার মেমরি গ্রহণ করে। যদিও বেশিরভাগ ক্ষেত্রে মেমোরির পরিমাণ গ্রাস করা খুব কম, তবে নেটওয়ার্ক ব্যান্ডউইদথ খুব কমই সমস্যা হয় যেহেতু বেশিরভাগ ডিবি সার্ভারগুলি অ্যাপ্লিকেশন সার্ভারের সাথে 10 মেগাবাইট ন্যূনতম (এই দিনগুলিতে সম্ভবত 100 মেগাবিট বা গিগাবিট) সংযোগগুলি সংযুক্ত রয়েছে () এবং কিছু এমনকি একই বাক্সে রয়েছে ;-)। নেটওয়ার্ক ব্যান্ডউইদথের চেয়ে এটি এবং মেমরি প্রায় সর্বদা একটি দুষ্প্রাপ্য সংস্থান।
আমি মনে করি, যে কেউ সফ্টওয়্যার লিখেছেন যা একাধিক ডাটাবেসের সাথে সংযুক্ত হতে পারে, তারপরে একটি স্ট্যান্ডার্ড ইন্টারফেসের সুবিধার্থে এই ব্যয় / উপকার বিশ্লেষণকে পরিবর্তন করতে পারে। তবে সেক্ষেত্রেও আমার বিশ্বাস করতে হবে যে "প্রমিত" ডিবি ইন্টারফেসটি বিমূর্ত করা এখনও যথেষ্ট সহজ যা বিভিন্ন সরবরাহকারীদের জন্য (এবং তাদের মধ্যে পার্থক্য যেমন কল করার দরকার নেইPrepare()
) প্রদত্ত যে এটি করা বেসিক অবজেক্ট given ওরিয়েন্টেড প্রোগ্রামিং যা আপনি সম্ভবত আপনার অ্যাপ কোড ;-)- এ ইতিমধ্যে করছেন।