নোকলের ইঙ্গিতটি রেকর্ডের ক্রম পরিবর্তন করে


11

একটি টেবিল Clientক্ষেত্রে একটি ক্লাস্টারড সূচক রয়েছে LastName

আমি যখন টেবিল থেকে কেবল সমস্ত রেকর্ড সরিয়ে ফেলি, সেগুলি বর্ণমালা অনুসারে উপস্থিত হয় যতক্ষণ (nolock)না প্রশ্নের মধ্যে প্রশ্ন হিসাবে ইঙ্গিত ব্যবহার করা হয়। এই ইঙ্গিতটি রেকর্ডের ক্রম পরিবর্তন করে। উচিৎ কি?. আমি ইতিবাচক যে অন্য কোনও অধিবেশনটিতে সেই টেবিলের পরিবর্তনগুলি (কমপক্ষে sp_who2আমাকে কোনও দেখায় না) এর সাথে খোলা লেনদেন নেই ।

অর্ডারের পার্থক্য কীভাবে ব্যাখ্যা করা যেতে পারে?

মন্তব্য থেকে নেওয়া অতিরিক্ত তথ্য:

  1. দ্বারা কোন আদেশ নেই। নন ক্লাস্টারড ইনডেক্স কি অর্ডার প্রয়োগ করতে পারে?

  2. ক্লাস্টারড ইনডেক্স নির্দিষ্ট করে সূচক ইঙ্গিত ব্যবহার করার পরেও কোয়েরিগুলি এখনও বিভিন্ন ক্রম ফেরত দেয়। তাদের উচিত? আমি ভাবছি কেন nolockপরিকল্পনাগুলির দৃশ্যমান পরিবর্তন ছাড়াই ফেরত রেকর্ডগুলির ক্রম পরিবর্তন করে?

  3. আমি তাদের উপর একটি উইনডিফ করেছি - [[]] (nolock)[কোয়েরি ইঙ্গিত] ব্যতীত একই ।


21
ইঙ্গিতটি অর্ডার পরিবর্তন করে না - কারণ কোনও আদেশ নেই যে পরিবর্তন করা যায়
a_horse_with_no_name

উত্তর:


47

কোনও ORDER BYধারা ছাড়াই অর্ডার করা ফলাফল সেটের উপস্থিতি প্রায়শই একটি স্ক্যান থেকে ফলাফলকে সূচক ক্রমে পুনরুদ্ধার করে। একটি সূচী-অর্ডার স্ক্যানটি সাধারণত ডিফল্ট READ COMMITTEDবিচ্ছিন্নতা স্তরের অধীনে কেন বেছে নেওয়া হয় তা হ'ল এটি একাধিক বার একই সারির মুখোমুখি হওয়া বা পুরোপুরি কিছু সারি বাদ দেওয়ার মতো অযাচিত সম্মতিজনিত অসঙ্গতিগুলির সম্ভাবনা হ্রাস করে। বিচ্ছিন্নতা স্তরগুলি সম্পর্কে এই সিরিজের নিবন্ধগুলি সহ এটি বেশ কয়েকটি স্থানে বিশদ ।

একটি সঙ্গে NOLOCKটেবিল ইঙ্গিতটি, এই আচরণ কবে নাগাদ করা হয়, এবং টেবিল এক্সেস আরো সহনশীল অধীনে সঞ্চালিত হয় READ UNCOMMITTEDবিচ্ছিন্নতা স্তর, যা হতে পারে বরাদ্দ অনুক্রমে স্ক্যান ডেটা পরিবর্তে সূচক অর্ডার। সেই লিঙ্কটিতে বর্ণিত হিসাবে, বরাদ্দ-আদেশ বা সূচক-আদেশ স্ক্যানটি ব্যবহার করবেন কিনা সে সম্পর্কে সিদ্ধান্তটি স্টোরেজ ইঞ্জিনের উপরে ছেড়ে যায়। এই পছন্দটি ক্যোয়ারী পরিকল্পনার কোনও পরিবর্তন ছাড়াই মৃত্যুদণ্ডের মধ্যে পরিবর্তন হতে পারে ।

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

USE AdventureWorks2012;
GO
-- Appears to be ordered by BusinessEntityID
-- File:Page:Slot goes up and down several times
-- Show physical locations with sys.fn_PhysLocFormatter (undocumented)
SELECT
    P.BusinessEntityID,
    [(File:Page:Slot)] =
        sys.fn_PhysLocFormatter(%%physloc%%)
FROM Person.Person AS P;

-- Same query with TABLOCK or NOLOCK
-- Allocation-order (IAM) scan
-- Now appears to be ordered by File:Page:Slot instead of BusinessEntityID
SELECT P.BusinessEntityID,
    [(File:Page:Slot)] =
        sys.fn_PhysLocFormatter(%%physloc%%)
FROM Person.Person AS P WITH (NOLOCK);

অনুসন্ধান ফলাফল

ক্যোয়ারী থেকে সামান্য সংশোধন সহ ধার করা পল হোয়াইট

শেষ অবধি, পরিষ্কার করার জন্য, এই উত্তরটি অর্ডার করা ফলাফল সেটটির উপস্থিতি সম্পর্কে । নেই কোন নিশ্চয়তা উপস্থাপনা অর্ডার একটি টপ লেভেল ছাড়া ORDER BY

একটি বরাদ্দ-ক্রম স্ক্যান বিভিন্ন পরিস্থিতিতে বিভিন্ন ক্ষেত্রে ঘটতে পারে যেমন টেবিল-স্তরের লক অর্জিত হয় বা ডাটাবেস কেবল পঠন মোডে থাকে। সমান্তরালতা তথ্যটি যে অর্থে ফেরত পাঠায় সেটিকেও প্রভাবিত করতে পারে point মূল বক্তব্যটি হ'ল ORDER BYঅর্ডার ডেটা ফেরত দেওয়া ডিজাইন অনুসারে সময়ের সাথে সাথে তারতম্য হতে পারে।


7
দুর্দান্ত, আমার অসমর্থিত প্রচেষ্টার চেয়ে অনেক বেশি নির্দিষ্ট। অবশ্যই আপনার শেষ দুটি অনুচ্ছেদে রয়েছে। "কেন" আসলেই আসলে শেষ হয় না। আমার চেয়ে আপনার মতো ভাগ্য ভাল হবে।
অ্যারন বারট্র্যান্ড

12

যখন আমি কেবল টেবিল থেকে সমস্ত রেকর্ড ছুঁড়ে ফেলি

... তাহলে আপনার কোনও অর্ডার আশা করা উচিত নয়। প্রকৃতপক্ষে একই ক্যোয়ারী একাধিকবার চালানো সতর্কতা ছাড়াই আবার ফিরে আসতে পারে। কারণটি হ'ল আপনার দুটি ক্যোয়ারী - যা সম্ভবত "ভিন্ন" ক্যোরির বিভিন্ন ক্যোয়ারী পাঠ্যের কারণে সম্ভবত ইঙ্গিতের কারণে নয় - তার বিভিন্ন প্রয়োগের পরিকল্পনা রয়েছে (এবং পার্থক্যটি সূক্ষ্ম হতে পারে যেমন একটি পুনরুক্তি যেমন একই দেখায় উভয় পরিকল্পনা, তবে ordered: trueকেবল একটিতে রয়েছে; বা আনুমানিক সারিগুলির বিস্তীর্ণ সংখ্যা রয়েছে কারণ একটি বড় ডেটা পরিবর্তনের আগে একটি সংকলিত হয়েছিল)। এটি এমনও হতে পারে যে বরাদ্দ অর্ডার স্ক্যান নেওয়া হচ্ছে, কারণ জেমস যথাযথভাবে তার উত্তরে উল্লেখ করেছে।

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

আমাকে এটি খুব পরিষ্কার করে দিন:

আপনি যদি কোনও নির্দিষ্ট আদেশ চান বা আশা করেন তবে একটি শর্ত অনুসারে একটি অর্ডার যুক্ত করুন

এটি এর আগে উঠে এসেছে:

এবং আমি এটি সম্পর্কে ব্লগ করেছি:

এখানে পরবর্তীকালের একটি উদ্ধৃতি যা একটি ORDER BYধারাটির পরিবর্তে একটি সূচক ইঙ্গিত ব্যবহার সম্পর্কে আপনার মন্তব্যকে আমি সম্বোধন করতে আমি কী বলেছিলাম তার পুনরাবৃত্তি করে :

এমনকি কোনও ইঙ্গিতযুক্ত সূচকের ক্ষেত্রেও, সূচকটি ব্যবহার করা হবে (সম্ভব হলে, বেশিরভাগ ক্ষেত্রে ত্রুটি), তবে সূচকটি ব্যবহার করা হয় না বলে এর ফলাফলগুলি কী (গুলি) দ্বারা সাজানো হবে তা বোঝায় না যে সূচক। ORDER BYসূচি কী (গুলি) দ্বারা বাছাই করা নিশ্চিত করার জন্য আপনার এখনও একটি দরকার ।

কনর কানিংহাম - একটি দুর্দান্ত স্মার্ট লোক, এসকিউএল সার্ভার যখন আপনার জন্য কোনও প্রশ্নের সমাধান করে তখন যা করে তার অনেকের জন্য সরাসরি দায়ী - এটি সম্পর্কে এখানে ব্লগও করেছে:

দয়া করে কিছু পাঠ করুন এবং তারপরে ORDER BYবিভিন্ন বা অপ্রত্যাশিত বাছাইয়ের অভিযোগ করার আগে আপনার প্রশ্নগুলিতে একটি ধারা যুক্ত করুন ।


11

জেমস চমত্কারভাবে ব্যাখ্যা কিভাবে এই কাজ করে, কিন্তু আমি ঠিক এক জিনিস পুনরাবৃত্তি করতে চাই: যদি না আপনি একটি ক্রম ফাংশন ব্যবহার, ফলে সেটে সারির অর্ডার undefined । আপনার যদি কোনও প্রদত্ত অর্ডারিংয়ের প্রয়োজন হয় তবে একটি স্পষ্ট order byধারাটি ব্যবহার করুন - আপনি যদি এটি নির্দিষ্ট না করেন তবে আপনি মূলত "আমি অর্ডারটি মোটেও যত্নবান নই" বলছি, "ক্লাস্টারড সূচক দ্বারা এটি অর্ডার করুন" না।

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