নির্বাচন / অন্তর্ভুক্ত ডেডলক


10

এই উদাহরণটি শেয়ারপয়েন্ট 2007 ডাটাবেস (এসপি) হোস্ট করে। এসপি বিষয়বস্তু ডাটাবেসের মধ্যে একটি বিশালভাবে ব্যবহৃত টেবিলের বিপরীতে আমরা অসংখ্য SELECT / INSERT ডেডলকগুলি অভিজ্ঞ করছি। আমি জড়িত সংস্থানগুলি সংকুচিত করেছি, উভয় প্রক্রিয়াতে নন-ক্লাস্টারড ইনডেক্সে লক প্রয়োজন।
INSERT- এ SELECT রিসোর্সে একটি আইএক্স লক প্রয়োজন এবং SELECT INSERT রিসোর্সে একটি এস লক দরকার। অচলাবস্থা গ্রাফ চিত্রিত এবং তিনটি সংস্থান, 1.) দুটি নির্বাচন (প্রযোজক / গ্রাহক সমান্তরাল থ্রেড) এবং 2) ইনসার্ট।
আমি আপনার পর্যালোচনার জন্য ডেডলক গ্রাফ সংযুক্ত করেছি। কারণ এটি মাইক্রোসফ্ট কোড এবং টেবিল স্ট্রাকচার আমরা কোনও পরিবর্তন করতে পারি না।
যাইহোক, আমি এমএসএফটি এসপি সাইটে পড়েছি যে তারা ম্যাক্সডপ ইন্সটেন্স স্তর স্তর কনফিগারেশন বিকল্পটি 1 এ সেট করার প্রস্তাব দেয় this


অতএব, আমি চেষ্টা করেছি এবং এই নির্বাচনী বিবৃতিগুলিকে সমান্তরাল থেকে আটকাতে চেষ্টা করব। আমি জানি এটি কোনও সমাধান নয়, সমস্যা সমাধানের ক্ষেত্রে সহায়তা করার জন্য আরও একটি অস্থায়ী পরিবর্তন। তবুও, কাজের চাপ পরিবর্তন না হওয়া সত্ত্বেও, "সমান্তরালতার জন্য মূল্য প্রান্তিককরণ" 25 থেকে 40 এর মধ্যে বাড়িয়েছি (সलेक्ट / INSERT ঘন ঘন ঘটছে) অচলাবস্থা অদৃশ্য হয়ে গেছে। আমার প্রশ্ন কেন?

এসপিআইডি 356 ইনসার্টের নন-ক্লাস্টারড ইনডেক্সের একটি পৃষ্ঠায় একটি আইএক্স লক রয়েছে
এসপিআইডি 690 নির্বাচন এক্সিকিউশন আইডি 0 একই নন-ক্লাস্টারড ইনডেক্সের একটি পৃষ্ঠায় এস লক রয়েছে

এখন

এসপিআইডি 356 এসপিআইডি 690 রিসোর্সে আইএক্স লক চায় তবে এটি চালিয়ে যায় না কারণ এসপিআইডি 356 এসপিআইডি 690 এক্সিকিউশন আইডি দ্বারা ব্লক করা হচ্ছে এসপিআইডি
690 এক্সিকিউশন আইডি 1 এসপিআইডি 356 রিসোর্সে একটি এস লক চায় তবে এটি পেতে পারে না কারণ এসপিআইডি 690 এক্সিকিউশন আইডি 1 এসপিআইডি 356 দ্বারা অবরুদ্ধ করা হচ্ছে এবং এখন আমাদের কাছে আমাদের অচলাবস্থা রয়েছে।

আমার স্কাইড্রাইভে এক্সিকিউশন প্ল্যান পাওয়া যাবে

সম্পূর্ণ ডেডলকের বিশদটি এখানে পাওয়া যাবে

যদি কেউ আমাকে বুঝতে সহায়তা করে তবে আমি কেন এটির সত্যই প্রশংসা করব।

ইভেন্টআরসিভারস টেবিল।
Uniqueidentifier তিনি 16 তম আইডি
নাম nvarchar কোন 512
uniqueidentifier তিনি 16 তম SiteId
WebId uniqueidentifier তিনি 16 তম
HostId uniqueidentifier তিনি 16 তম
HostType int- এ No 4
ItemId int- এ No 4
DirName nvarchar কোন 512
nvarchar কোন 256 LeafName
টাইপ int- No 4
SequenceNumber int- এ No 4
পরিষদের nvarchar কোন 512
ক্লাস nvarchar না 512
ডেটা এনভারচর ন 512
ফিল্টার এনভারচর ন 512
সোর্সড আইডি টি কনটেন্ট টাইপআইডি নং 512
সোর্স টাইপ ইন্ট
নং 4
ক্রেডেনসিয়াল ইন্ট নং 4 কনটেক্সট টাইপ ভেরিবিনারি ন 16
ContextEventType varbinary তিনি 16 তম
ContextId varbinary তিনি 16 তম
ContextObjectId varbinary তিনি 16 তম
ContextCollectionId varbinary তিনি 16 তম

index_name index_description index_keys
EventReceivers_ByContextCollectionId nonclustered প্রাথমিক SiteId অবস্থিত, ContextCollectionId
EventReceivers_ByContextObjectId প্রাথমিক SiteId অবস্থিত nonclustered, ContextObjectId
EventReceivers_ById nonclustered, প্রাথমিক SiteId অবস্থিত, ID অনন্য
EventReceivers_ByTarget ক্লাস্টার, প্রাথমিক SiteId, WebId, HostId, HostType, প্রকার, ContextCollectionId, ContextObjectId অবস্থিত অনন্য, ContextId, ContextType, ContextEventType, SequenceNumber,
એસেম্বলি, শ্রেণি ইভেন্টআরসিভারস_আইডুয়ানিক নন-ক্লাস্টার্ড, অনন্য, অনন্য কী প্রাইমারি আইডিতে অবস্থিত


2
আমাদের কি করতে proc_InsertEventReceiverএবং proc_InsertContextEventReceiverনা যে আমরা XDL নেই দেখতে পারেন? এছাড়াও সমান্তরালতা হ্রাস করতে সার্ভার-ওয়াইড সেটিংসের সাথে ফিউজিংয়ের পরিবর্তে এই বিবৃতিগুলি সরাসরি (ম্যাক্সডপ 1 ব্যবহার করে) প্রভাব ফেলবেন না কেন?
অ্যারন বারট্রান্ড

1
আপনার সেভার প্রশস্ত ম্যাক্সডপ সেটিং কী এবং আপনার কাছে কত প্রসেসর (যৌক্তিক) রয়েছে তা আমি আগ্রহী। শেয়ারপয়েন্টটি সত্যই আরও ভাল কাজ করে এবং ম্যাক্সডপ সার্ভার 1 বিস্তৃত সার্ভারে থাকতে পছন্দ করে .. আমি এটি পছন্দ করি না তবে তারা এটিকে এটি বিকশিত করেছিল। আপনি বাস্তব বাস্তবায়ন পরিকল্পনা পোস্ট করতে পারেন? এই লিঙ্কটিতে আমি যা দেখছি তা হ'ল .xdl (ডেডলক গ্রাফ)
মাইক ওয়ালশ

হ্যালো ভদ্রলোক, আমি সাড়া দেওয়ার জন্য আপনার ব্যস্ত সময়সূচীর বাইরে সময় দিয়ে সত্যই আপনাকে ধন্যবাদ জানাই। আমি স্কাইড্রাইভ সাইটে আপনার পর্যালোচনার জন্য পদ্ধতি এবং প্রয়োগের পরিকল্পনা উভয়ই পোস্ট করব। আমি ম্যাক্সডপ (1) ক্যোয়ারী বিকল্পটি অন্তর্ভুক্ত করার জন্য কোডটি সংশোধন করার কথা ভেবেছিলাম, তবে এটি করা মাইক্রোসফ্টের সাথে আমাদের সমর্থনকে বাতিল করে দেবে। শারীরিক সার্ভারটি একটি প্রোলিয়েন্ট ডিএল 580 জি 4 ম্যাক্সডপ সেটিং 4 টি মোট 8 টি শারীরিক প্রসেসরের সাথে রয়েছে এবং এইচ / টি অক্ষম করা আছে।
এসকিউএল জারহিড

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

1
সুতরাং, আপনি কোডটি পরিবর্তন করতে পারবেন না এবং আপনি স্কিমা পরিবর্তন করতে পারবেন না, আপনি কী কী সমাধান সমাধান করবেন বলে আশা করছেন? আপনি যদি মাইক্রোসফ্ট সমর্থন সমর্থন করার বিষয়ে উদ্বিগ্ন হন, তবে এর থেকে বোঝা যায় যে আপনার কাছে মাইক্রোসফ্ট সমর্থন রয়েছে, সেই ক্ষেত্রে - আপনি আমাদের যে সমস্ত বিধিনিষেধ বলেছেন যে আপনি করতে পারবেন না - আপনি কি মাইক্রোসফ্টের সাথে সমর্থন টিকিট খোলার কথা বিবেচনা করেছেন?
অ্যারন বারট্র্যান্ড

উত্তর:


14

এর মুখে এটি দেখতে ক্লাসিক লুকআপের ডেডলকের মতো দেখাচ্ছে । এই অচলাবস্থা প্যাটার্নের জন্য প্রয়োজনীয় উপাদানগুলি হ'ল:

  • একটি SELECTঅনুসন্ধান যা কোনও কী লুকআপ সহ একটি অ-coveringাকনা অবিচ্ছিন্ন সূচক ব্যবহার করে
  • INSERTক্লোস্টারড ইনডেক্স এবং তারপরে অবিচ্ছিন্ন সূচককে পরিবর্তন করে এমন একটি কোয়েরি

SELECTNonclustered সূচক প্রথম, তারপর ক্লাস্টার সূচক ব্যবহারের হার। INSERTএক্সেস ক্লাস্টার সূচক প্রথম, তারপর nonclustered সূচি। অসম্পূর্ণ লকগুলি অর্জন করার জন্য একই সংস্থানগুলিকে ভিন্ন ক্রমে অ্যাক্সেস করা অবশ্যই একটি অচলাবস্থার 'অর্জন' করার দুর্দান্ত উপায়।

এই ক্ষেত্রে, SELECTক্যোয়ারীটি হ'ল:

নির্বাচন জিজ্ঞাসা

... এবং INSERTক্যোয়ারীটি হ'ল:

INSERT ক্যোয়ারী

সবুজ হাইলাইট অ ক্লাস্টার ইনডেক্স রক্ষণাবেক্ষণ লক্ষ্য করুন।

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

সংশ্লিষ্ট সিস্টেমে অ্যাক্সেস এবং উপযুক্ত অনুমতিগুলি দেওয়া, আমি নিশ্চিত আমি অবশেষে সমান্তরাল পরিকল্পনার সাথে কেন স্থবিরতা দেখা দেয় তবে সিরিয়ালটি নয় (একই সাধারণ আকারটি ধরে) exactly তদন্তের সম্ভাব্য লাইনগুলির মধ্যে অনুকূলিত নেস্টেড লুপগুলি এবং / অথবা প্রিফেচিংয়ের জন্য চেক করা অন্তর্ভুক্ত রয়েছে - উভয়ই অভ্যন্তরীণভাবে বিবৃতিটির সময়কালের জন্য বিচ্ছিন্নতা স্তরকে বাড়িয়ে তুলতে পারে REPEATABLE READ। এটিও সম্ভব যে সমান্তরাল সূচকের কিছু বৈশিষ্ট্য রেঞ্জের নিয়োগের বিষয়টি ইস্যুতে অবদান রাখে। যদি সিরিয়াল পরিকল্পনাটি উপলভ্য হয়ে যায়, তবে সম্ভবত বিশদটি আরও আকর্ষণীয় হওয়ায় আমি আরও কিছু বিশদ বিশদটি অনুসন্ধান করতে ব্যয় করতে পারি।

এই ধরণের ডেডলকিংয়ের জন্য সাধারণ সমাধানটি সূচকে আচ্ছাদন তৈরি করা হয়, যদিও এই ক্ষেত্রে কলামগুলির সংখ্যা এটি অযৌক্তিক করে তুলতে পারে (এবং এটি ছাড়াও আমাদের শেয়ার পয়েন্টে এই জাতীয় জিনিসগুলির সাথে গণ্ডগোল করার কথা নয়, আমাকে বলা হয়েছে)। শেষ অবধি, শেয়ারপয়েন্ট ব্যবহার করার সময় কেবল সিরিয়াল-সংক্রান্ত পরিকল্পনার জন্য সুপারিশটি কোনও কারণের জন্য রয়েছে (যদিও এটি ভালভাবে আসে না, যখন এটি সরাসরি আসে)। সমান্তরালতার জন্য ব্যয় প্রান্তিকের পরিবর্তন যদি মুহুর্তের জন্য সমস্যার সমাধান করে, এটি ভাল। দীর্ঘ মেয়াদী, আমি সম্ভবত কাজের চাপ আলাদা করতে চাইব, সম্ভবত রিসোর্স গভর্নর ব্যবহার করে যাতে শেয়ারপয়েন্টের অভ্যন্তরীণ প্রশ্নগুলি পছন্দসই MAXDOP 1আচরণ পেতে পারে এবং অন্যান্য অ্যাপ্লিকেশনটি সমান্তরালতা ব্যবহার করতে সক্ষম হয়।

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


6

যদি এটি একটি ক্লাসিক লুকআপ ডেডলক ছিল , তবে উত্স তালিকায় ক্লাস্টারড সূচক এবং নন-ক্লাস্টারড ইনডেক্স উভয়ই অন্তর্ভুক্ত থাকবে। সাধারণত নির্বাচনগুলি এনসি সূচকে একটি শেয়ারড লক ধরে সিআইয়ের উপর একটি ভাগ করা লকটির জন্য অপেক্ষা করবে, ইতিমধ্যে ইনসার্ট সিআই-তে একটি এক্সক্লুসিভ লক অর্জন করবে এবং এনসির একটি এক্সক্লুসিভ লকের জন্য অপেক্ষা করবে। ডেডলক এক্সএমএলে থাকা সংস্থান তালিকাটি এই ক্ষেত্রে এই দুটি অবজেক্টকে তালিকাভুক্ত করবে।

যেহেতু অচলাবস্থা গ্রাফটি কেবলমাত্র এনসি সূচককে অন্তর্ভুক্ত করে আমরা সেই বিকল্পটি বাতিল করতে পারি।

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

এটি আমাদের ধরে নিতে পারে যে এটি সমান্তরাল পরিকল্পনার কারণে একটি অচলাবস্থা।

ডেডলক গ্রাফটি যথাযথভাবে রেন্ডার করা হয়নি, তবে আপনি যদি ডেডলক এক্সএমএলটি দেখেন তবে দেখতে পাবেন যে SELECT স্টেটমেন্টের দুটি থ্রেড (এসপিআইডি 690) অচলাবস্থায় জড়িত। গ্রাহক থ্রেডটি পৃষ্ঠা 1219645 এ একটি ভাগ করা লক ধরে এবং পোর্ট 801f8ed0 (e_waitPipeGetRow) এ নির্মাতার জন্য অপেক্ষা করছে। প্রযোজক থ্রেড PAGE 1155940 এ ভাগ করা লকের জন্য অপেক্ষা করছে।

INSERT বিবৃতিটি PAGE 1155940 এ একটি আইএক্স লক ধরে আছে এবং পৃষ্ঠা 1219645 এ একটি আইএক্স লকের জন্য অপেক্ষা করছে, যার ফলে একটি অচলাবস্থা রয়েছে in

আমি বিশ্বাস করি যে নির্বাচনী বিবৃতিটির জন্য সিরিয়াল পরিকল্পনা ব্যবহার করার সময় একটি অচলাবস্থা রোধ করা হবে যেহেতু কোনও পর্যায়ে এটির জন্য একাধিক পৃষ্ঠায় ভাগ করা লক লাগবে না। আমি আরও মনে করি যে সিরিয়াল পরিকল্পনা সমান্তরাল পরিকল্পনার প্রায় সমান হবে (সমান্তরালতা অপারেটরকে স্যান করে)।

[পলের মন্তব্যের ভিত্তিতে আপডেট করা]

স্পষ্টতই পরিকল্পনাটি একটি অপটিমাইজড নেস্টেড লুপ অ্যালগরিদম ব্যবহার করছে

এটি ব্যাখ্যা করে যে বিবৃতিটি শেষ না হওয়া পর্যন্ত কেন ভাগ করা লকগুলি রাখা হয়। সমান্তরাল পরিকল্পনার সাথে সমান্তরাল পরিকল্পনার সাথে মিলিত পুনঃপঠনযোগ্য পঠনটি সিরিয়াল পরিকল্পনার চেয়ে অচলাবস্থার পক্ষে বেশি ঝুঁকির কারণ প্যারালাল প্ল্যানটি সূচকের বিভিন্ন রেঞ্জের লকগুলি অর্জন করতে পারে এবং সিরিয়াল প্ল্যানটি আরও অনুক্রমিক পদ্ধতিতে লকগুলি অর্জন করে।


একমত। এই অচলাবস্থাটি যদি একটি প্রকৃত লুকআপের সাথে সম্পর্কিত ছিল তবে নির্বাচনের জন্য অপেক্ষা সংস্থানটি ক্লাস্টারড সূচকটি উল্লেখ করতে পারত। আমি প্রতিটি অপেক্ষার উত্সের জন্য পৃষ্ঠার শিরোনামটি প্রদর্শন করতে সক্ষম হয়েছি (এসপিআইডি 690 অপেক্ষা করুন রিসোর্স = পৃষ্ঠা: 1155940 | এসপিআইডি 356 অপেক্ষা করুন রিসোর্স = পৃষ্ঠা 1219645) এবং ইনডেক্স আইডি 5 (ইনডেক্সআইডি 5 = ইভেন্টআরিসিভারস_বাইকনটেক্সটঅবজেক্টআইডি) -এ ছিলেন যা নির্দিষ্ট সারণীতে এনসি সূচকে নির্দেশ করে (ইভেন্টআরিসিভার)।
এসকিউএল জারহাইড

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

২) কোনও অপ্টিমাইজড নেস্টেড লুপ অ্যালগরিদম কি সর্বদা বিচ্ছিন্নতা স্তরটিকে পুনরায় পরিবর্তনযোগ্য পড়তে সেট করবে? আমি এক্সিকিউশন পরিকল্পনা এক্সএমএল আউটপুট চেক করেছি এবং আমি কেবল এসপিআইডি সংযোগের জন্য পড়ার প্রতিশ্রুতিবদ্ধ দেখতে পাচ্ছি। আমি একটি অনুমান করছি যে এটি কেবলমাত্র পরিকল্পনা অপারেটর স্তরে আমন্ত্রিত। (2/2)
এসকিউএল জারহিড

অপ্টিমাইজড নেস্টেড লুপগুলির লকিং আচরণটি পুনরাবৃত্তিযোগ্য রিডের সাথে তুলনীয় ( বিবৃতি শেষ হওয়া পর্যন্ত লকগুলি রাখে ), তবে এটি স্পষ্টতার সাথে লেনদেনের বিচ্ছিন্নতা স্তরটিকে পুনরাবৃত্তিযোগ্য রিডের সাথে সেট করে না। আমি মনে করি এটি আপনার প্রশ্নের উত্তরও দেয়। এটি এমন নয় যে সমান্তরাল থ্রেডগুলি একসাথে একাধিক পৃষ্ঠার জন্য অনুরোধ করছে, তবে একটি সমান্তরাল থ্রেড একটি পৃষ্ঠায় একটি লক ধরে আছে এবং অন্য থ্রেড অন্য পৃষ্ঠায় একটি লকের জন্য অপেক্ষা করছে
রোজি পি থমাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.