এসকিউএল সার্ভার নলক এবং যোগদান করে


153

পটভূমি: আমার একটি পারফরম্যান্স-সমালোচনামূলক ক্যোয়ারী রয়েছে যা আমি চালাতে চাই এবং আমি নোংরা পড়ার বিষয়ে চিন্তা করি না।

আমার প্রশ্ন; যদি আমি যোগদান করি তবে আমারও কি তাদের সাথে NOLOCK ইঙ্গিতটি নির্দিষ্ট করতে হবে?

এই ক্ষেত্রে; হল:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID

সমতুল্য:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID

অথবা আমি (NOLOCK)যোগদানের টেবিলটি লক করছি না তা নিশ্চিত করার জন্য আমার কী যোগসূচির ইঙ্গিত নির্দিষ্ট করতে হবে?

উত্তর:


166

আমি READ UNCOMMITTEDযুক্তিটি সম্বোধন করব না , কেবল আপনার আসল প্রশ্ন।

হ্যাঁ, আপনার WITH(NOLOCK)যোগদানের প্রতিটি টেবিলের প্রয়োজন । না, আপনার প্রশ্নগুলি এক নয়।

এই অনুশীলন চেষ্টা করুন। একটি লেনদেন শুরু করুন এবং টেবিল 1 এবং টেবিল 2 এ একটি সারি .োকান। লেনদেনটি কমিট বা রোলব্যাক করবেন না। এই মুহুর্তে আপনার প্রথম ক্যোয়ারী সাফল্যের সাথে ফিরে আসবে এবং অনিবদ্ধ সারিগুলি অন্তর্ভুক্ত করবে; আপনার দ্বিতীয় ক্যোয়ারীটি ফিরে আসবে না কারণ টেবিল 2 এর মধ্যে WITH(NOLOCK)ইঙ্গিত নেই।


18

আমি বেশ নিশ্চিত ছিলাম যে আপনার প্রশ্নের NOLOCKপ্রত্যেকটির জন্য নির্দিষ্ট করা দরকার JOIN। তবে আমার অভিজ্ঞতা এসকিউএল সার্ভার 2005 এর মধ্যে সীমাবদ্ধ ছিল।

আমি নিশ্চিত করার জন্য যখন এমএসডিএনকে দেখলাম তখন আমি সুনির্দিষ্ট কিছু খুঁজে পেলাম না। নীচের বিবৃতিগুলি আমাকে ভাবতে বাধ্য করেছে যে ২০০৮-এর জন্য আপনার উপরের দুটি বিবৃতি সমান হলেও এটি ২০০৫ সালের মতো নয়:

[এসকিউএল সার্ভার ২০০৮ আর 2]

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

[এসকিউএল সার্ভার ২০০৫]

এসকিউএল সার্ভার 2005-এ, সমস্ত লক ইঙ্গিতগুলি সমস্ত টেবিলে এবং ভিউতে প্রচার করা হয় যা একটি দৃশ্যে উল্লেখ করা হয়। এছাড়াও, এসকিউএল সার্ভার সম্পর্কিত লক ধারাবাহিকতা পরীক্ষা করে।

অতিরিক্ত হিসাবে, লক্ষ্য করুন - এবং এটি 2005 এবং ২০০৮ উভয় ক্ষেত্রেই প্রযোজ্য:

টেবিলের ইঙ্গিতগুলি উপেক্ষা করা হবে যদি কোয়েরি পরিকল্পনার মাধ্যমে টেবিলটি অ্যাক্সেস না করা হয়। এটি অপ্টিমাইজারের টেবিলটি মোটেই অ্যাক্সেস না করা বাছাইয়ের কারণে বা এর পরিবর্তে কোনও সূচকযুক্ত ভিউ অ্যাক্সেস করার কারণে হতে পারে। পরবর্তী ক্ষেত্রে, OPTION (EXPAND VIEWS)কোয়েরি ইঙ্গিতটি ব্যবহার করে একটি সূচিযুক্ত ভিউ অ্যাক্সেস করা আটকাতে পারে ।


@ সানে: আকর্ষণীয় ... এর জন্য ধন্যবাদ ... আমি ধরে নিচ্ছি যে এটি জিনস-এ যোগ দিয়ে আমি কোনও ক্ষতি করছি না, যদিও এটি সম্পূর্ণ প্রয়োজনীয় নয়? NOLOCK- এ থাকা ডকুমেন্টেশনটি যেমন উল্লেখ করেছেন তেমন বিচ্ছিন্ন; আমি নিজেকে নির্ধারিত কিছু খুঁজে পেতে সমস্যায় পড়েছি।
ড্যানপি

2
@ ইনসান: আপনি কোথা থেকে এই তথ্যটি পেয়েছেন? মনে হচ্ছে এটি গৃহীত উত্তরের বিরুদ্ধে গেছে।
জে সুলিভান

1
@notfed - পড়ুন TechNet লিংক technet.microsoft.com/en-us/library/ms187373(v=sql.105).aspx - আপনি ডিবি বিভিন্ন সংস্করণ জন্য একই প্রবন্ধে তুলনা করতে উপরের ডাটাবেসের সংস্করণ পরিবর্তন করতে পারেন
Jagmag

2
২০০৫ এর পাঠ্যটি ভিউউস সম্পর্কে আলোচনা করে। সুতরাং আপনি যদি "(নোলক) সহ মাইভিউ থেকে" করেন তবে এটি বলছে যে নলকটি মাইভিউতে জড়িত সমস্ত সারণী এবং দর্শনগুলিতে প্রচারিত হয়েছে (আপনি সেখানে 10 টিতে যোগ দিতে পারেন)। 2008 সালের পাঠ্যটি হ'ল অর্থটি কী তা বোঝায় না কেন এটি ভিউ ছাড়াও "ক্যোয়ারী প্ল্যান দ্বারা অ্যাক্সেস করা" যুক্ত করে।
থিয়েরি_স

9

আমরাও। আপনি পৃথকীকরণ স্তরটি সেট করেছেন READ UNCOMMITTEDযা স্বতন্ত্র লক ইঙ্গিত দেওয়ার চেয়ে সর্বদা ভাল। বা আরও ভাল, যদি আপনি ধারাবাহিকতার মতো বিশদ সম্পর্কে যত্নশীল হন তবে স্ন্যাপশট বিচ্ছিন্নতা ব্যবহার করুন ।


@ রেমাস: আমি নিশ্চিত নই যে আমি আমার ক্ষেত্রে অননুমোদিত পড়াটি ব্যবহার করতে পারি কারণ আমি একটি বিশেষ কাঁচা অ্যাডো.নেট কল করার জন্য এনএইচবারনেটের মাধ্যমে সংযোগটি অ্যাক্সেস করছি; এটিকে ক্যোয়ারিতে ইনলাইন নির্দিষ্ট করা যেতে পারে, বা এটি এনএইচবারনেট লেনদেনে উপস্থিত লেনদেনের স্তরটি মেনে চলবে?
ড্যানপি

কল মোড়ানো using (TransactionScope scope=new TransactionScope(..., TransactionOptions) {...}এবং সেট IsolationLevel: বিকল্পগুলি msdn.microsoft.com/en-us/library/...
রেমাস Rusanu

@ রেমাস: দুর্ভাগ্যক্রমে, লেনদেন পরিচালনার পক্ষে এর চেয়ে অনেক উচ্চ স্তরে যত্ন নেওয়া হয়, সুতরাং এটিও কোনও বিকল্প নয়।
ড্যানপি

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

2
তবে আপনি কি স্ন্যাপশট বিচ্ছিন্নতা বিবেচনা করেছেন? ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON;। ফলাফলগুলি দর্শনীয়, কারণ সমস্ত সাধারণ পাঠিত প্রতিশ্রুতিবদ্ধ পাঠগুলি স্ন্যাপশট পাঠায় রূপান্তরিত হয়, লক মুক্ত তবুও সামঞ্জস্যপূর্ণ। খরচ বেড়ে যায় tempdbলোড: msdn.microsoft.com/en-us/library/ms175492.aspx
রেমাস Rusanu
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.