স্কেলকম্যান্ড.প্রিপ্রে () ব্যবহার করার অর্থ এবং সুবিধা কী?


14

আমি বিকাশকারী কোড জুড়ে এসেছি যেখানে এসকিউএল কোয়েরিগুলি কার্যকর করার আগে স্কেলকম্যান্ড.প্রিপ্রে () (এমএসডিএন দেখুন) পদ্ধতিটি ব্যাপকভাবে ব্যবহৃত হয়। এবং আমি ভাবছি এর কী লাভ?

নমুনা:

command.Prepare();
command.ExecuteNonQuery();
//...
command.Parameters[0].Value = 20;
command.ExecuteNonQuery();

আমি প্রায় কিছুটা খেলেছি এবং ট্রেস করেছি। Prepare()পদ্ধতিটি কল করার পরে কমান্ডের প্রয়োগটি এসকিএল সার্ভারকে নিম্নলিখিত বিবৃতিটি কার্যকর করে:

declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,N'@id int,@desc text',N'INSERT INTO dbo.testtable (id) VALUES (@id)',@id=20'
select @p1

এর পরে যখন প্যারামিটারটির মান হয় এবং SqlCommand.ExecuteNonQuery()তাকে বলা হয়, নিম্নলিখিত স্কেল সার্ভারে কার্যকর করা হয়:

exec sp_execute 1,@id=20

আমার কাছে এটি দেখে মনে হচ্ছে বিবৃতিটি Prepare()কার্যকর হওয়ার সাথে সাথেই সংকলিত হয়ে যায়। আমি ভাবছি এর কী লাভ? এর অর্থ কি এটি প্ল্যান ক্যাশে রাখা হয়েছে এবং কাঙ্ক্ষিত প্যারামিটার মানগুলির সাথে চূড়ান্ত ক্যোয়ারী চালানো মাত্রই আবার ব্যবহার করা যেতে পারে?

আমি বুঝতে পেরেছি (এবং এটি অন্য কোনও প্রশ্নে নথিভুক্ত করেছি ) যে স্কেলকম্যান্ডগুলি যে সমস্ত স্কেলপ্যারামিটারগুলি দিয়ে কার্যকর করা হয় সবসময় sp_executesqlপ্রক্রিয়া কলগুলিতে আবৃত থাকে । এটি স্কেল সার্ভারকে প্যারামিটার মানগুলির স্বতন্ত্রভাবে পরিকল্পনাগুলি সংরক্ষণ এবং পুনরায় ব্যবহার করতে সক্ষম করে।

এ সম্পর্কে আমি ভাবছি যে prepare()পদ্ধতিটি কি অপ্রয়োজনীয় বা অপ্রচলিত বা আমি এখানে কিছু অনুপস্থিত?


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

যদিও এই কথাটি বলার পরে, এই পিএইচপি ব্যাখ্যাটি সম্ভবত। নেট পিএইচপিএন
মার্ক সিংকিনসন

"হ্যাঁ স্যার। ড্রাইভার, বাইরে বেরিয়ে যাওয়ার প্রস্তুতি নিন।" "আপনি কী প্রস্তুতি নিচ্ছেন? আপনি সর্বদা প্রস্তুতি নিচ্ছেন! চলে যান!"
সমস্ত ব্যবসায়ের জন

উত্তর:


19

প্রস্তুত এসকিউএল ব্যাচ কার্যকরভাবে পৃথক করে একটি এসকিউএল ব্যাচ প্রস্তুত করা এমন একটি গঠন যা কার্যকরভাবে কার্যকর **এসকিউএল সার্ভারের জন্য অকেজো যে কার্যকর প্রয়োগগুলি ক্যাশে হয় তা দেওয়া হয়। প্রস্তুতির পদক্ষেপগুলি পৃথক করে (পার্সিং করা, কোনও প্যারামিটার বাঁধাই, এবং সংকলন) এবং প্রয়োগ যখন কেবল কোনও ক্যাশে নেই তখনই কার্যকর হয়। উদ্দেশ্য হ'ল একটি বিদ্যমান পরিকল্পনা পুনরায় ব্যবহার করে পার্সিং এবং সংকলনের জন্য ব্যয় করা সময় সাশ্রয় করা এবং এটি অভ্যন্তরীণ পরিকল্পনা ক্যাশেটি করে। তবে সমস্ত আরডিবিএমএসই এই স্তরটি ক্যাচিং করে না (স্পষ্টভাবে এই ফাংশনগুলির অস্তিত্ব থেকে) এবং তাই কোনও প্ল্যান "ক্যাশেড" হওয়ার অনুরোধ করার জন্য ক্লায়েন্ট কোডে ছেড়ে দেওয়া হয়েছে, এবং সেই ক্যাশে আইডি সংরক্ষণ করুন এবং তারপরে পুনরায় ব্যবহার করুন এটা। এটি ক্লায়েন্ট কোডে অতিরিক্ত বোঝা (এবং প্রোগ্রামার এটি করা এবং এটি সঠিকভাবে মনে করার জন্য) এটি অপ্রয়োজনীয়। আসলে, 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 ওরিয়েন্টেড প্রোগ্রামিং যা আপনি সম্ভবত আপনার অ্যাপ কোড ;-)- এ ইতিমধ্যে করছেন।


এই বিস্তৃত উত্তরের জন্য আপনাকে ধন্যবাদ। আমি আপনার পদক্ষেপগুলি পরীক্ষা করেছি এবং আপনার প্রত্যাশাগুলি / ফলাফলগুলি থেকে দুটি বিঘ্ন ঘটেছে: ৪ র্থ ধাপে আমি একটি অতিরিক্ত ফলাফল পেয়েছি। পদক্ষেপ 10-এ আমি দ্বিতীয় ধাপ 2-এর চেয়ে আরও প্ল্যান-হ্যান্ডল পেয়েছি
Magier

1
@ ম্যাজিয়ার 4 য় পদক্ষেপ সম্পর্কে নিশ্চিত নন ... সম্ভবত আপনার কাছে বিভিন্ন এসইটি বিকল্প ছিল বা কোনওভাবে দুজনের মধ্যে ক্যোয়ারী পাঠ্য আলাদা ছিল? এমনকি একটি একক অক্ষর (দৃশ্যমান বা না) পার্থক্য একটি আলাদা পরিকল্পনা হবে। এই ওয়েব পৃষ্ঠা থেকে অনুলিপি করা ও পেস্ট করা উপকারে আসতে পারে না, তাই নিশ্চিত হওয়ার জন্য ক্যোয়ারিতে (একক উদ্ধৃতিগুলির মধ্যে থাকা সমস্ত কিছু) sp_prepareকল থেকে অনুলিপি করুন sp_executesql। দশম ধাপের জন্য, হ্যাঁ, আমি গতকাল আরও পরীক্ষা করেছি এবং এর জন্য বিভিন্ন হ্যান্ডলগুলি সহ কিছু উপলক্ষগুলি দেখেছি sp_prepare, তবে এখনও কখনও একইরকম নয় sp_executesql। আমি আরও একটি জিনিস পরীক্ষা করব এবং আমার উত্তর আপডেট করব।
সলোমন রুটজকি

1
@ ম্যাজিয়ার আসলে, পরীক্ষার আগে আমি এটিটি coveredেকেছিলাম এবং আমি মনে করি না যে পরিকল্পনার সত্যিকারের পুনরায় ব্যবহার হয়েছে, বিশেষত এমএসডিএন ফোরামের পোস্টে বলে যে এটি কেবল এসকিউএলকে ক্যাশে করে। আমি এখনও আগ্রহী যে এটি কীভাবে পরিকল্পনা_হাঁদা পুনরায় ব্যবহার করতে সক্ষম হয় যেখানে sp_executesqlনা পারে বা না পারে। তবে নির্বিশেষে, sp_prepareপরিকল্পনাটি ক্যাশে থেকে সরিয়ে দেওয়া হয়েছে পার্স টাইম এখনও আছে তাই আমি আমার উত্তরের সেই অংশটি সরিয়ে ফেলব (আকর্ষণীয় তবে অপ্রাসঙ্গিক)। আপনার সরাসরি প্রশ্নের সমাধান না করায় সেই অংশটি যাইহোক আকর্ষণীয় দিক নোট ছিল। বাকি সমস্ত কিছুই এখনও প্রযোজ্য।
সলোমন রুটজকি

1
এটিই আমি ব্যাখ্যা করছিলাম।
সিশারপি

5

এটি সম্পর্কে আমি ভাবছি যে প্রস্তুতি () পদ্ধতিটি কোনও ধরণের অকেজো বা অপ্রচলিত বা আমি এখানে কিছু অনুপস্থিত রয়েছি কিনা?

আমি বলব যে প্রস্তুতি পদ্ধতির সীমাবদ্ধ মূল্য স্কেলকম্যান্ড বিশ্ব রয়েছে, এটি সম্পূর্ণ অকেজো নয়। একটি সুবিধা হ'ল যে প্রস্তুতি আইডিবিকম্যান্ড ইন্টারফেসের অংশ যা স্কেলকম্যান্ড প্রয়োগ করে। এটি একই কোডটি শর্তসাল যুক্তি ছাড়াই অন্যান্য ডিবিএমএস সরবরাহকারীদের (যার জন্য প্রস্তুতের প্রয়োজন হতে পারে) বিরুদ্ধে চালানোর অনুমতি দেয়, প্রিপারিকে ফোন করা উচিত কিনা তা নির্ধারণ করতে।

এসএকিউএল সার্ভারের জন্য নেট ব্যবহারকারীর সাথে প্রস্তুতিটির কোনও মূল্য নেই এই ব্যবহারের ক্ষেত্রেগুলি, আফাইক।

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