ব্যবহার না করে সেট করুন


341

এই সংখ্যাটি থেকে অনুপ্রাণিত যেখানে সেট নোটের উপর পৃথক পৃথক দৃষ্টিভঙ্গি রয়েছে ...

এসকিউএল সার্ভারের জন্য আমাদের কি সেট নোট ব্যবহার করা উচিত? তা না হলে কেন?

এটি 22 জুলাই 2011-এ 6 সম্পাদনা করে

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

ট্রিগার ইত্যাদির জন্য ক্লায়েন্ট একাধিক "এক্সএক্স সারি প্রভাবিত" পাবেন এবং এটি কিছু ওআরএম, এমএস অ্যাক্সেস, জেপিএ ইত্যাদির জন্য সমস্ত ধরণের ত্রুটির কারণ হয়ে থাকে (নীচে সম্পাদনা দেখুন)

পটভূমি:

সাধারণ গৃহীত সেরা অনুশীলন (আমি এই প্রশ্ন না হওয়া পর্যন্ত ভেবেছিলাম) SET NOCOUNT ONএসকিউএল সার্ভারে ট্রিগার এবং সঞ্চিত পদ্ধতিতে ব্যবহার করা। আমরা এটিকে সর্বত্র ব্যবহার করি এবং একটি দ্রুত গুগল প্রচুর পরিমাণে এসকিউএল সার্ভার এমভিপি দেখায়।

এমএসডিএন বলছে এটি একটি নেট নেট এসকিউএলডেটা অ্যাডাপ্টারকে ভেঙে ফেলতে পারে

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

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

প্রশ্নে marc_s (কে তার এসকিউএল স্টাফ জানে) বলে যে এটি ব্যবহার করবেন না। এটি আমার যা মনে হয় তার থেকে পৃথক হয় (এবং আমি নিজেকে এসকিউএল-তেও কিছুটা সক্ষম হিসাবে বিবেচনা করি)।

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

দ্রষ্টব্য: আমি এই ত্রুটিটি দেখেছি বহু বছর হয়েছে কারণ আমি আজকাল এসকিউএলডেটা অ্যাডাপ্টার ব্যবহার করি না।

মন্তব্য এবং প্রশ্নের পরে সম্পাদনা:

সম্পাদনা করুন: আরও চিন্তা ...

আমাদের একাধিক ক্লায়েন্ট রয়েছে: কেউ সি # এসকিউএলডেটা অ্যাডাপ্টর ব্যবহার করতে পারে, অন্য জাভা থেকে এনহাইবারনেট ব্যবহার করতে পারে। এগুলি বিভিন্নভাবে প্রভাবিত হতে পারে SET NOCOUNT ON

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

সম্পাদনা 2: একটি ট্রিগার ব্রেকিং এন হাইবারনেট প্রশ্ন , কোথায় SET NOCOUNT ONসেট করা যায় না

(এবং না, এটা না সদৃশ যেটির এই )

3 সম্পাদনা করুন: তবুও আরও তথ্য, আমার এমভিপি সহকর্মীকে ধন্যবাদ

সম্পাদনা 4: 13 মে 2011

ব্রেকড লিনক 2 এসকিউএলও নির্দিষ্ট না হলে?

5 সম্পাদনা করুন: 14 জুন 2011

টেবিল ভেরিয়েবলগুলি সহ জেপিএ ভাঙা, সংরক্ষণাগারভুক্ত: জেপিএ 2.0 কি এসকিউএল সার্ভারের টেবিল ভেরিয়েবলগুলিকে সমর্থন করে?

সম্পাদনা 6: 15 আগস্ট 2011

এসএসএমএসের "সারিগুলি সম্পাদনা করুন" ডেটা গ্রিডে সেট নট অ্যাকাউন্ট চালু করা দরকার: গ্রুপের মাধ্যমে আপডেট ট্রিগার

সম্পাদনা করুন 7: 07 মার্চ 2013

@ রেমাসরুসানু থেকে গভীরতার বিশদগুলিতে আরও:
কার্যকারিতার পার্থক্যকে সত্যিকার অর্থে কোনও কিছুই নির্ধারণ করা যায় না


@ অ্যালেক্সকুজনসভ: "থ্রেডস্যাফ" পদ্ধতি কী হবে? অবশ্যই উপস্থিতগুলিতে সম্পাদিত পাঠগুলি এখনও কোনও বকেয়া লেনদেন অন্তর্ভুক্ত করা হবে?
অ্যান্থনিডাব্লু জোন্স

2
@ জেরেমি সেগি: দেরি করা জবাবের জন্য দুঃখিত। (# প্রভাবিত) বার্তাটি একটি ক্লায়েন্ট সরঞ্জাম জিনিস যা এসএসএমএস ইত্যাদির দ্বারা ব্যাখ্যা করা হয়: তবে এই তথ্য সহ একটি প্যাকেট প্রেরণ করা আছে। অবশ্যই, আমি জানি যে এমডুয়েজ রোউকাউন্টগুলি কীভাবে কাজ করে ইত্যাদি, তবে এটি প্রশ্নের মূল বিষয় নয় ...
gbn

1
কোন চিন্তা করো না. ব্যক্তিগতভাবে আমি আপনার অবস্থানের সাথে একমত; আমি কেবল মন্তব্য করছিলাম যে কোনও আইএফ / যেখানে উপস্থিত রয়েছে এবং কোন সেট নির্ধারণের ফলাফলের মধ্যে সরাসরি সম্পর্ক নেই। আমি NOCOUNT নির্বিশেষে those সমস্ত নির্মাণগুলি থেকে ধারাবাহিক ফলাফল পেয়েছি। আপনার যদি অন্যথায় কিছু বলতে থাকে তবে দয়া করে আমার কাছে এটি প্রেরণ করুন।
জেরেমি এস

1
@ জেরেমি সেগি: আপনি সঠিক: নিখরচায় কেবলমাত্র ক্লায়েন্টের কাছে অতিরিক্ত প্যাকেট ডেটা চাপায় । IF, @@ ROWCOUNT ইত্যাদি সমস্তই ক্ষতিগ্রস্থ নয়। ওহ, এবং এটি এসকিউএলডেটা অ্যাডাপ্টারগুলিকে ভেঙে দেয় ... :-)
জিবিএন

1
@ ক্যারেন জনস্টোন: দৃষ্টিতে, এটি একটি খারাপ শব্দযুক্ত প্রশ্ন। আমি যদি আমার প্রশ্ন না থাকি তবে আমি ভোট দিয়ে যাব ...
gbn

উত্তর:


245

ঠিক আছে এখন আমি আমার গবেষণা করেছি, এখানে চুক্তিটি রয়েছে:

টিডিএস প্রোটোকলে, SET NOCOUNT ONকেবলমাত্র ক্যোয়ারী অনুসারে 9-বাইট সংরক্ষণ করা হয় যখন "SET NOCOUNT ON" পাঠ্যটি নিজেই পুরো 14 বাইট। আমি ভাবতাম যে 123 row(s) affectedএটি একটি পৃথক নেটওয়ার্ক প্যাকেটে সরল পাঠ্যে সার্ভার থেকে ফিরে এসেছিল তবে এটি কেস নয়। এটি আসলে একটি ছোট কাঠামো যা DONE_IN_PROCপ্রতিক্রিয়াতে এম্বেড করা হয়। এটি কোনও পৃথক নেটওয়ার্ক প্যাকেট নয় তাই কোনও রাউন্ডট্রিপ নষ্ট হয় না।

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

এখানে SET NOCOUNTসেটিংসের তুচ্ছতা সম্পর্কে একটি বিশদ বিশদ বিশ্লেষণ দেওয়া আছে : http://daleburnett.com/2014/01/Everything-ever-wanted- ज्ञान-set-nocount/


প্রকৃতপক্ষে. আমি চিরকালের জন্য সেট নম্বর ব্যবহার করে চলেছি, তবে মার্ক_রা অন্য প্রশ্নের মধ্যে এসকিউএলডেটা অ্যাডাপ্টারের সীমাবদ্ধতা নির্দেশ করেছে।
gbn

ধন্যবাদ। বাইটস বা আকার আমার পক্ষে সমস্যা নয়, তবে ক্লায়েন্টকে এটি প্রক্রিয়া করতে হবে। এটি এসকিউএলডেটা অ্যাডাপ্টার নির্ভরতা যা এখনও আমাকে
অবাক করে দেয়

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

13
এটি তারের চেয়ে বৃত্তাকার ভ্রমণের বিলম্বের সংখ্যা নয় যা পারফরম্যান্স হত্যাকারী
র্যাকিংসনেল

1
টিডিএস বার্তা প্রবাহে এবং উদাহরণটি হ'ল যখন কোনও সারণীতে কেবলমাত্র মান সন্নিবেশ করানো হয়। DONINPROC(RPC) বা DONE(BATCH) বার্তাটি rowcountপ্রভাবিত সারিগুলিতে সেট করে স্ট্রিম করা হয় , যখন done_countপতাকাটি trueনির্বিশেষে NO_COUNTহয় ON। যখন ক্লোয়ারি SELECT স্টেটমেন্ট বা আরপিসি কলগুলি নির্বাচন করে তা ধরে রাখলে ক্ষেত্রে ক্লায়েন্ট lib বাস্তবায়নের উপর নির্ভরশীল হয়, এটি গণনা অক্ষম করতে হতে পারে ... যখন অক্ষম হয়ে থাকে, সারিগুলি এখনও নির্বাচিত বিবৃতি হিসাবে গণনা করা হয়, তবে পতাকা DONE_COUNTসেট করা থাকে false। এটি আপনার পরিবর্তে টোকেন (বার্তা) প্রবাহটি ব্যাখ্যা করবে সেহেতু আপনার ক্লায়েন্ট লাইব কী পরামর্শ দেয় তা সর্বদা পড়ুন
মিলান জারিক

87

NOCOUNT- এর আশেপাশে সত্যিকারের বেঞ্চমার্কের পরিসংখ্যানগুলি খুঁজতে আমাকে প্রচুর খনন হয়েছে, তাই আমি বুঝতে পেরেছিলাম যে আমি একটি দ্রুত সংক্ষিপ্তসার ভাগ করব।

  • যদি আপনার সঞ্চিত প্রক্রিয়াটি কোনও দ্রুত ফলাফল না পেয়ে খুব দ্রুত অপারেশন করার জন্য একটি কার্সার ব্যবহার করে তবে কোনও অ্যাকাউন্ট অফ না থাকলে এটি চালিয়ে যাওয়ার জন্য প্রায় 10 গুণ সময় নিতে পারে। 1 এটি সবচেয়ে খারাপ পরিস্থিতি।
  • যদি আপনার সঞ্চিত পদ্ধতিটি কোনও প্রত্যাশিত ফলাফল ছাড়াই কেবলমাত্র একক দ্রুত অপারেশন সম্পাদন করে তবে NOCOUNT অন সেট করা প্রায় 3% কার্যকারিতা বৃদ্ধি করতে পারে st 2 এটি একটি সাধারণ সন্নিবেশ বা আপডেট পদ্ধতির সাথে সামঞ্জস্যপূর্ণ হবে। (কেন এটি সর্বদা দ্রুত না হতে পারে সে সম্পর্কে কিছু আলোচনার জন্য এই উত্তরের মন্তব্য দেখুন))
  • যদি আপনার সঞ্চিত পদ্ধতিতে ফলাফল আসে (যেমন আপনি কোনও কিছু নির্বাচন করেন), ফলাফলের আকারের সাথে আনুপাতিকভাবে পারফরম্যান্সের পার্থক্য হ্রাস পাবে।

5
কার্সারে প্রভাবের জন্য +1, এটি আমার পর্যবেক্ষণগুলির সাথে সামঞ্জস্যপূর্ণ
zvolkov

পয়েন্ট 2 সঠিক নয়! আমি বোঝাতে চাইছি এটি ব্লগ। কখনো ছিল না! DOE এবং DONEPROC এবং DONEINPROC একই আকারের সাথে প্রেরণ করা হয় নির্বিশেষে যদি NO_COUNT টি চালু বা বন্ধ করা থাকে। রউকাউন্ট এখনও ইউলংলং (by৪ বাইট) হিসাবে রয়েছে এবং পতাকা DONE_COUNT এখনও রয়েছে তবে বিট মান 0 রয়েছে S যদি আপনি @@ ROWCOUNT পড়েন তবে আপনি টোকেন স্ট্রমে আরও বাইট যুক্ত করেছেন রিটার্নালুয়ে টোকেন আকারে বা অন্য কোলমেডেটা + সারি টোকেন হিসাবে!
মিলান জারিক

@ মিলানজারিক: এটিকে আহ্বান করার জন্য ধন্যবাদ। আপনি আমাকে বুঝতে সাহায্য করেছেন যে আমি ভুল নিবন্ধটি যুক্ত করেছি। লিঙ্কটি এখনই আপডেট হয়েছে, এবং নিবন্ধটি সেট নোট অন দিয়ে কিছুটা পারফরম্যান্স উন্নতি হতে পারে তা দেখানোর জন্য একটি বাধ্যতামূলক যুক্তি তৈরি করে। আপনি কি মনে করেন যে ব্যবহার করা বেঞ্চমার্ক পদ্ধতিতে সমস্যা আছে?
স্ট্রিপলিং ওয়ারিয়র

:) সেট নোট অফ / অন সম্পর্কে এখনও ভুল, ত্রুটিটি হ'ল দ্বিতীয় এসপি নেই SET NOCOUNT OFF;এবং সে কারণেই তারা মনে করেন যে তারা প্রতিক্রিয়াতে অতিরিক্ত বাইট পাচ্ছেন না। সঠিক মাপদণ্ডটি SET NOCOUNT ONবাম এবং SET NOCOUNT OFFডান সঞ্চিত পদ্ধতিতে ব্যবহার করা হবে। এই ভাবে আপনি সঙ্গে উত্সমূলে প্যাকেজ পাবেন DONEINPROC (SET NOCOUNT ...)আবার, দশ DONEINPROC (INSERT statement), এবং তারপর RETURNVALUE(@@ROWCOUNT), তারপর RETURNSTATUS 0SP এবং finaly DONPROC। ত্রুটি রয়েছে কারণ দ্বিতীয় এসপির শরীরে কোনও সেট অফ নেই!
মিলান জারিক 2'19

তারা যা পেয়েছিল তা পুনরায় ব্যাখ্যা করতে পারে তবে তারা বুঝতে পারেনি যে আপনার কাছে যদি 1K টি আনার কার্সারের অনুরোধ থাকে তবে প্রথমে একটি অনুরোধ করুন সংযোগের জন্য অন বা অফ অফ করুন এবং তারপরে কিছু ব্যান্ডউইথ সংরক্ষণ করতে 1K বার কার্সার আনতে কল করতে একই সংযোগটি ব্যবহার করুন। অনুলিপি অন বা অফের জন্য আসল সংযোগের অবস্থা ব্যান্ডউইথকে প্রভাবিত করবে না, এটি কেবল ক্লায়েন্টের লাইব যেমন ADO.net বা ODBC কে বিভ্রান্ত করতে পারে। সুতরাং "যদি আপনি ব্যান্ডউইথের বিষয়ে চিন্তা করেন তবে সেট নম্বরটি ব্যবহার না করুন << হোয়াটওয়ার> :) :)
মিলান জারিক

77
  • যখন সেট নোট চালু থাকে, তখন গণনা (কোনও লেনদেন-এসকিউএল বিবৃতি দ্বারা প্রভাবিত সারিগুলির সংখ্যা নির্দেশ করে) ফেরত দেওয়া হয় না। যখন কোনও সেট অফ নেই, গণনাটি ফেরত দেওয়া হয়। এটি যে কোনও নির্বাচন, অন্তর্ভুক্ত, আপডেট, বিলোপ বিবৃতি দিয়ে ব্যবহৃত হয়।

  • SET NOCOUNT এর সেটিং কার্যকর করা বা চালানোর সময় সেট করা হয়েছে পার্স সময় নয়।

  • কোনও সেট অন সঞ্চয় করা পদ্ধতি (এসপি) এর কার্যকারিতা উন্নত করে।

  • সিনট্যাক্স: সেট করুন নট অ্যাকাউন্ট {অন | বন্ধ}

অন ​​নোট অন সেট উদাহরণ:

এখানে চিত্র বর্ণনা লিখুন

নোট অফ অফ সেট উদাহরণ:

এখানে চিত্র বর্ণনা লিখুন


7
স্ক্রিনশটগুলির সাহায্যে সহজ এবং দ্রুত। দারূন কাজ. :)
শাইজুট

35

আমি কিছু ডিগ্রী অনুমান করি এটি ডিবিএ বনাম বিকাশকারী ইস্যু।

বেশিরভাগ দেব হিসাবে, আমি বলতে চাই যে আপনি এটি ইতিমধ্যে ইতিবাচকভাবে না চালিয়ে ব্যবহার করবেন না - কারণ এটি ব্যবহার করা আপনার ADO.NET কোডটি (মাইক্রোসফ্ট দ্বারা নথিভুক্ত হিসাবে) ভঙ্গ করতে পারে।

এবং আমি ডিবিএ হিসাবে অনুমান করি, আপনি অন্যদিকে আরও থাকবেন - যতক্ষণ সম্ভব সম্ভব এটি ব্যবহার করুন যদি না আপনি সত্যিই এর ব্যবহার রোধ করেন must

এছাড়াও, যদি আপনার ডেভসরা কখনও এডিও.নেট এর ExecuteNonQueryপদ্ধতি কল দ্বারা "রেকর্ডসএফেক্টেড" ব্যবহার করে থাকে তবে আপনি যদি সমস্যায় পড়ে থাকেন তবে সবাই যদি SET NOCOUNT ONএই ক্ষেত্রে ব্যবহার করে তবে এক্সিকিউটননকুইয়ারি সর্বদা 0 এ ফিরে আসবে।

পিটার ব্রমবার্গের ব্লগ পোস্টটি দেখুন এবং তার অবস্থানটি দেখুন।

সুতরাং কে সত্যগুলিকে মান নির্ধারণ করতে পারে তার দিকে এটি সত্যিই ফুটে উঠেছে :-)

আঙ্গুরের ছিরড়া


যদিও তিনি সহজ সিআরইউডি সম্পর্কে রয়েছেন: তিনি যে ডেটা গ্রিডের উল্লেখ করেছেন
সেগুলি

আমি অনুমান করি আপনি যদি কখনই স্ক্যালডিটাএডাপ্টার ব্যবহার না করেন এবং এক্সিকিউটননকিউয়ারী দ্বারা ফিরে আসা "রেকর্ডগুলি প্রভাবিত" নাম্বারটি কখনও পরীক্ষা করে দেখে এবং নির্ভর করেন না (যেমন আপনি যদি লিনক-টু-এসকিউএল বা এনএইচবারনেট জাতীয় কিছু ব্যবহার করেন) তবে সম্ভবত আপনার কোনও সমস্যা নেই সমস্ত সঞ্চিত প্রকোপগুলিতে সেট নোট ব্যবহার করা হচ্ছে।
marc_s

12

যদি আপনি বলছেন যে আপনার বিভিন্ন ক্লায়েন্টও থাকতে পারে তবে ক্লাসিক এডিওতে সমস্যা নেই যদি সেট না করে সেট না করা থাকে।

একটি আমি নিয়মিত অনুভব করি: যদি কোনও সঞ্চিত পদ্ধতিতে বেশ কয়েকটি বিবৃতি কার্যকর করা হয় (এবং এভাবে "xxx সারিগুলি প্রভাবিত" বার্তা ফিরে আসে), এডিও এটি পরিচালনা করে না বলে মনে হয় এবং ত্রুটি ছুঁড়ে ফেলে "রেকর্ডসেট অবজেক্টের অ্যাক্টিভ সংযোগ বৈশিষ্ট্যটি পরিবর্তন করতে পারে না যার উত্স হিসাবে একটি কমান্ড অবজেক্ট রয়েছে ""

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


9

জিনিসগুলিকে আরও জটিল করে তোলার ঝুঁকিতে, আমি উপরে দেখা সমস্তকেই কিছুটা আলাদা নিয়মকে উত্সাহিত করি:

  • সর্বদা সেট NOCOUNT ON, একটি proc উপরের আগে আপনি proc যে কোন কাজ করবে, কিন্তু এছাড়াও সবসময়SET NOCOUNT OFF সঞ্চিত proc থেকে কোন recordsets ফেরার আগে আবার।

সুতরাং "আপনি যখন কোনও রেজাল্ট সেটটি ফিরে আসছেন তখন ব্যতীত" সাধারণত অনাকাঙ্ক্ষিত থাকুন "। আমি কোনও উপায়ে জানি না যে এটি কোনও ক্লায়েন্ট কোডটি ভেঙে ফেলতে পারে, এর অর্থ ক্লায়েন্ট কোডের কখনই প্রোক ইন্টার্নাল সম্পর্কে কিছু জানতে হবে না, এবং এটি বিশেষভাবে কঠোর নয় isn't


ধন্যবাদ। আপনি অবশ্যই ডেটাসেট বা গ্রাহক ধারক থেকে রোউকাউন্ট পেতে পারেন তবে কার্যকর হতে পারে। আমরা SELECTs এ ট্রিগার রাখতে পারি না তাই এটি নিরাপদ হবে: বেশিরভাগ ক্লায়েন্ট ত্রুটি ডেটা পরিবর্তনে উত্সাহিত বার্তাগুলির কারণে ঘটে।
gbn

এই নিয়মের সাথে সমস্যাটি কেবল এটিই পরীক্ষা করা শক্ত যে "প্র্যাকের শীর্ষে কি সেট করা আছে?"; আমি ভেবে অবাক হই যে এসকিউএল এনালাইটের মতো এসকিউএল এনালাইটস সরঞ্জামগুলি এই ধরণের জন্য পরীক্ষা করতে পারে ... এটি আমার এসকিউএল ফর্ম্যাটর প্রকল্পের জন্য আমার দীর্ঘমেয়াদী টোডো তালিকায় যুক্ত করে :)
তাও

5

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

এসপিগুলির ব্যবহার সম্পর্কে, এটি ব্যক্তিগত পছন্দের বিষয়। আমি সর্বদা সারি গণনা বন্ধ করে দিয়েছিলাম, কিন্তু তারপরে আবার কোনও সত্যিকারের শক্ত যুক্তি নেই।

অন্য একটি নোটে, আপনার সত্যই এসপি-ভিত্তিক আর্কিটেকচার থেকে সরে যাওয়া বিবেচনা করা উচিত, তবে আপনার এমনকি এই প্রশ্নও থাকবে না।


1
আমি সঞ্চিত প্রকল্পগুলি থেকে সরে যাওয়ার সাথে একমত নই। এর অর্থ হ'ল আমাদের 2 টি পৃথক ক্লায়েন্ট কোড বেসগুলিতে একই এসকিউএল থাকতে হবে এবং আমাদের ক্লায়েন্ট কোডারে বিশ্বাস রাখতে হবে। আমরা বিকাশকারী ডিবিএ। এবং আপনি "সেট নট অ্যাকাউন্ট " বলতে চান না ?
gbn

@ কোডবেলেন্ড: আপনার প্রয়োজনের তুলনায় কেবল এটি গুগল করুন। তবে ... stackoverflow.com/a/4040466/27535
gbn

3

আমি নিজেকে যাচাই করতে চেয়েছিলাম যে 'সেট অন নট অন' কোনও নেটওয়ার্ক প্যাকেট বা একটি রাউন্ডট্রিপ সংরক্ষণ করে না

আমি অন্য হোস্টে একটি পরীক্ষা এসকিউএল সার্ভার 2017 ব্যবহার করেছি (আমি একটি ভিএম ব্যবহার create table ttable1 (n int); insert into ttable1 values (1),(2),(3),(4),(5),(6),(7) go create procedure procNoCount as begin set nocount on update ttable1 set n=10-n end create procedure procNormal as begin update ttable1 set n=10-n end করেছি ) তারপরে আমি 'ওয়্যারশার্ক' সরঞ্জাম দিয়ে 1433 বন্দরটিতে প্যাকেটগুলি সনাক্ত করেছি: 'ক্যাপচার ফিল্টার' বোতাম -> 'পোর্ট 1433'

exec procNoCount

এটি প্রতিক্রিয়া প্যাকেট: 0000 00 50 56 c0 00 08 00 0c 29 31 3f 75 08 00 45 00 0010 00 42 d0 ce 40 00 40 06 84 0d c0 a8 32 88 c0 a8 0020 32 01 05 99 fe a5 91 49 e5 9c be fb 85 01 50 18 0030 02 b4 e6 0e 00 00 04 01 00 1a 00 35 01 00 79 00 0040 00 00 00 fe 00 00 e0 00 00 00 00 00 00 00 00 00

exec procNormal

এটি প্রতিক্রিয়া প্যাকেট: 0000 00 50 56 c0 00 08 00 0c 29 31 3f 75 08 00 45 00 0010 00 4f d0 ea 40 00 40 06 83 e4 c0 a8 32 88 c0 a8 0020 32 01 05 99 fe a5 91 49 e8 b1 be fb 8a 35 50 18 0030 03 02 e6 1b 00 00 04 01 00 27 00 35 01 00 ff 11 0040 00 c5 00 07 00 00 00 00 00 00 00 79 00 00 00 00 0050 fe 00 00 e0 00 00 00 00 00 00 00 00 00

40 লাইনে আমি '07' দেখতে পাচ্ছি যা 'সারি (গুলি) দ্বারা প্রভাবিত' এর সংখ্যা। এটি প্রতিক্রিয়া প্যাকেটের অন্তর্ভুক্ত। কোনও অতিরিক্ত প্যাকেট নেই।

তবে এটিতে 13 টি অতিরিক্ত বাইট রয়েছে যা সংরক্ষণ করা যেতে পারে, তবে কলামের নাম হ্রাস করার চেয়ে সম্ভবত এটি মূল্যবান নয় (যেমন 'ম্যানেজিংপেটর' থেকে 'এমডি')

সুতরাং আমি এটি সম্পাদনার জন্য ব্যবহার করার কোনও কারণ দেখতে পাচ্ছি না

কিন্তু অন্যরা যেমন উল্লেখ করেছে এটি অ্যাডো.নেটকে ভেঙে ফেলতে পারে এবং আমি পাইথন ব্যবহার করে কোনও সমস্যায় পড়ে গিয়েছিলাম: খেয়েছিলাম এমএসএসকিউএল ২০০৮ - পাইডবিসি - পূর্ববর্তী এসকিউএল কোনও প্রশ্ন ছিল না

তাই সম্ভবত এখনও একটি ভাল অভ্যাস ...


1
SET NOCOUNT ON;

কোডের এই লাইনটি এসকিউএলে কোয়েরি প্রয়োগের ক্ষেত্রে প্রভাবিত নম্বর সারিগুলি না ফেরানোর জন্য ব্যবহৃত হয়। যদি আমাদের প্রভাবিত সারির সংখ্যা না প্রয়োজন হয় তবে আমরা এটি ব্যবহার করতে পারি কারণ এটি মেমরির ব্যবহার বাঁচাতে এবং ক্যোয়ারির প্রয়োগের গতি বাড়িয়ে তুলতে সহায়তা করবে would


2
মনে রাখবেন যে @@ ROWCOUNT টি এখনও সেট আছে। এসকিউএল সার্ভার ক্লায়েন্টকে প্রেরণ করে যে কোনও অতিরিক্ত প্রতিক্রিয়া দমন করে নেই সেট করুন। উপরে গৃহীত উত্তর দেখুন দয়া করে
gbn

1

অন ​​নোট সেট করুন; উপরের কোডটি এসএমএল সার্ভার ইঞ্জিন দ্বারা উত্পাদিত বার্তাটি ডিএমএল / ডিডিএল কমান্ড কার্যকর হওয়ার পরে ফ্রন্টযুক্ত ফলাফল উইন্ডোতে বন্ধ করবে।

আমরা এটা কেন করি? এসকিউএল সার্ভার ইঞ্জিনটি স্থিতি পেতে এবং বার্তাটি উত্পন্ন করতে কিছু সংস্থান গ্রহণ করার কারণে এটি এসকিএল সার্ভার ইঞ্জিনের ওভারলোড হিসাবে বিবেচিত হয় o সুতরাং আমরা অন-অ্যাকাউন্ট বার্তাটি সেট করেছিলাম।


1

SET NOCOUNT ONসত্যিই সাহায্য করতে পারে এমন একটি জায়গা যেখানে আপনি লুপ বা কার্সারে কোয়েরি করছেন। এটি প্রচুর নেটওয়ার্ক ট্র্যাফিক যুক্ত করতে পারে।

CREATE PROCEDURE NoCountOn
AS
set nocount on
    DECLARE @num INT = 10000
    while @num > 0
    begin
       update MyTable SET SomeColumn=SomeColumn
       set @num = @num - 1
    end
GO


CREATE PROCEDURE NoCountOff
AS
set nocount off
    DECLARE @num INT = 10000
    while @num > 0
    begin
       update MyTable SET SomeColumn=SomeColumn
       set @num = @num - 1
    end
GO

এসএসএমএসে ক্লায়েন্টের পরিসংখ্যান চালু করা, এটি একটি রান EXEC NoCountOnএবং এটি EXEC NoCountOffদেখায় যে নোকাউন্ট অফে অতিরিক্ত 390KB ট্রাফিক ছিল:

ক্লায়েন্ট পরিসংখ্যান

কোনও লুপ বা কার্সারে অনুসন্ধান করা সম্ভবত আদর্শ নয় তবে আমরা আদর্শ বিশ্বেও বাস করি না :)


0

আমি জানি এটি বেশ পুরানো প্রশ্ন। তবে কেবল আপডেটের জন্য।

"সেট নট অন" ব্যবহারের সর্বোত্তম উপায় হ'ল এটি আপনার এসপিতে প্রথম বিবৃতি হিসাবে স্থাপন করা এবং শেষ নির্বাচন বাছাইয়ের ঠিক আগে এটি আবার বন্ধ করা setting


-1

ক্লায়েন্ট এবং এসকিউএল-এর মধ্যে কীভাবে সেট নট অ্যাকাউন্ট পরীক্ষা করতে হয় তা আমি জানি না, তাই আমি অন্যান্য সেট কমান্ড "সেট ট্রানসেকশন আইসোলেশন লেভেল রিড অব ইউনিটস"

আমি আমার সংযোগ থেকে এসকিউএল এর পূর্বনির্ধারিত আচরণ (READ COMMITTED) পরিবর্তন করে একটি আদেশ পাঠিয়েছিলাম এবং পরবর্তী কমান্ডগুলির জন্য এটি পরিবর্তন করা হয়েছিল। আমি যখন কোনও সঞ্চিত পদ্ধতির ভিতরে আইসোলেশন স্তরটি পরিবর্তন করেছি তখন এটি পরবর্তী কমান্ডের সাথে সংযোগ আচরণটি পরিবর্তন করে নি।

বর্তমান উপসংহার,

  1. সঞ্চিত পদ্ধতির অভ্যন্তরে সেটিংস পরিবর্তন করা সংযোগের ডিফল্ট সেটিংস পরিবর্তন করে না।
  2. অ্যাডো-কানেকশন ব্যবহার করে কমান্ড পাঠিয়ে সেটিংস পরিবর্তন করা ডিফল্ট আচরণকে পরিবর্তন করে।

আমি মনে করি এটি অন্যান্য এসইটি কমান্ডের সাথে প্রাসঙ্গিক যেমন "সেট নট অন"


আপনার উপরের 1 পয়েন্টটি কী বোঝায় যে আপনি বিশ্বব্যাপী পরিবেশকে প্রভাবিত করে না বলে আপনাকে শেষ পর্যন্ত কোনও সংখ্যা সেট করার দরকার নেই?
ফানকিমশরুম

আমি নিশ্চিত নই যে তিনি 1 পয়েন্টটি দিয়ে এটাই বোঝাতে চেয়েছিলেন তবে আমার পরীক্ষাগুলিতে হ্যাঁ, স্পষ্টতই বিশ্বব্যাপী পরিবেশ কোনও সঞ্চিত পদ্ধতিতে সেট নট অ্যাকাউন্ট দ্বারা প্রভাবিত হয় না।
ডগ

এটি তুলনার একটি নিখুঁত পছন্দ ছিল, কারণ বিচ্ছিন্নতা স্তরটি একটি নির্দিষ্ট লেনদেনের সাথে স্পষ্টভাবে সম্পর্কিত, সুতরাং এটির মতো একটি সেটিংসের সাথে সামঞ্জস্যতা হওয়ার আশা করার কোনও বিশেষ কারণ নেইNOCOUNT
আইএমএসওপি

-1

যদি (কোনও গণনা সেট করা নেই == বন্ধ)

{তারপরে এটি কতগুলি রেকর্ডকে প্রভাবিত করেছিল তাই কার্যকারিতা হ্রাস করবে তার ডেটা রাখবে} অন্যথায় - এটি পরিবর্তনের রেকর্ডটিকে ট্র্যাক করবে না তাই পারফোমেস উন্নত করে}}


-1

কখনও কখনও এমনকি সহজ জিনিস একটি পার্থক্য করতে পারে। এই সরল আইটেমগুলির মধ্যে একটি যা প্রতিটি সঞ্চিত পদ্ধতির অংশ হওয়া উচিত SET NOCOUNT ON। সঞ্চিত পদ্ধতির শীর্ষে রাখা কোডের এই এক লাইনটি প্রতিটি টি-এসকিউএল বিবৃতি কার্যকর করার পরে এসকিউএল সার্ভার ক্লায়েন্টকে যে বার্তা প্রেরণ করে তা বন্ধ করে দেয়। এই সব জন্য সঞ্চালিত হয় SELECT, INSERT, UPDATE, এবং DELETEবিবৃতি। আপনি যখন কোনও কোয়েরি উইন্ডোতে টি-এসকিউএল স্টেটমেন্ট চালাচ্ছেন তখন এই তথ্যটি ব্যবহার করা সহজ, তবে যখন সঞ্চিত পদ্ধতিগুলি চালানো হয় তখন ক্লায়েন্টের কাছে এই তথ্য ফেরত দেওয়ার প্রয়োজন হয় না।

নেটওয়ার্ক থেকে এই অতিরিক্ত ওভারহেড সরিয়ে এটি আপনার ডাটাবেস এবং অ্যাপ্লিকেশনটির সামগ্রিক কর্মক্ষমতাকে ব্যাপকভাবে উন্নত করতে পারে।

যদি আপনার টি-এসকিউএল স্টেটমেন্ট কার্যকর করে যা দ্বারা সারি সংখ্যাটি প্রভাবিত করতে হয় তবে আপনি এখনও @@ROWCOUNTবিকল্পটি ব্যবহার করতে পারেন । একটি SET NOCOUNT ONফাংশন জারি করে ( @@ROWCOUNT) এখনও কাজ করে এবং আপনার সঞ্চিত পদ্ধতিতে বিবৃতি দ্বারা কতগুলি সারি প্রভাবিত হয়েছিল তা সনাক্ত করতে ব্যবহার করা যেতে পারে।

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