এসকিউএল সার্ভার ২০০৮ - পার্টিশন এবং ক্লাস্টার্ড সূচি


16

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

আমাদের ডিজাইনের দিকগুলি কীভাবে পুনর্বিবেচনা করা উচিত সে সম্পর্কে মন্তব্যগুলি সম্ভবত সঠিক তবে অসহায় :)

আমার একটি খুব বড় টেবিল রয়েছে, প্রায় 150 টি ক্ষেত্র প্রশস্ত এবং প্রায় 600 মি সারি, এটি প্রচুর সংখ্যক প্রক্রিয়া চালিত করে। এটি একটি ডেটা গুদামের পরিস্থিতিতে রয়েছে তাই নির্ধারিত লোড প্রক্রিয়াটির বাইরে আমাদের কোনও আপডেট / সন্নিবেশ নেই, তাই এটি ভারী সূচকযুক্ত।

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

বর্তমানে আমরা এমন একটি ফিল্ডে ক্লাস্টার করেছি যা আমরা কল করব IncidentKeyযা একটি varchar(50)এবং অনন্য নয় - আমাদের সাথে এটি 1-100 রেকর্ড থাকতে পারে IK(দয়া করে কোনও মন্তব্য নেই)। আমরা প্রায়শই পুরানো IncidentKeyরেকর্ডগুলিতে নতুন ডেটা পাই তাই এটি অনুক্রমিকও নয়।

আমি বুঝতে পারছি পার্টিশনটি IncidentDateসঠিকভাবে কাজ করার জন্য আমার ক্লাস্টারড ইনডেক্স কীতে আমার পার্টিশন ক্ষেত্রটি অন্তর্ভুক্ত করা দরকার । আমি ভাবছি এটা হবে IncidentKey, IncidentDate

প্রশ্নটি হল, ক্লাস্টারড ইনডেক্সের মেকানিকরা কীভাবে পার্টিশনযুক্ত টেবিলের একটি 2 অংশ কীতে কাজ করবে, যদি একটি "নতুন" পার্টিশনে রেকর্ডটি ক্লাস্টারড ইনডেক্সের "পুরানো" পার্টিশনে রেকর্ডের আগে হওয়া উচিত?

উদাহরণস্বরূপ, আমার কাছে 5 টি রেকর্ড রয়েছে:

IncidentKey    Date

ABC123        1/1/2010
ABC123        7/1/2010
ABC123        1/1/2011
XYZ999        1/1/2010
XYZ999        7/1/2010

আমি যদি ABC123, 2/1/2011এটির জন্য একটি নতুন রেকর্ড পাই তবে আগে ক্লাস্টারড সূচীতে থাকা দরকার XYZ999, 1/1/2010 । কিভাবে কাজ করে?

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


কেন টেবিল বিভাজনের সিদ্ধান্ত নেওয়া হয়েছিল? বিভাজন থেকে প্রত্যাশিত সুবিধা কী কী?
রেমাস রুসানু

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

উত্তর:


18

পার্টিশনযুক্ত টেবিলটি সত্যই অনেকগুলি পৃথক টেবিলগুলির সংমিশ্রণের মতো যা একসাথে সেলাই করা হয়। সুতরাং আপনার দ্বারা ক্লাস্টারিং দ্বারা IncidentKeyএবং পার্টিশন দ্বারা বিভাজন IncidentDate, পার্টিশন ফাংশনটি টেবিলগুলিকে দুটি পার্টিশনে বিভক্ত করে যাতে 1/1/2010 পার্টিশনে 1 এবং 7/1/2010 পার্টিশন দুটি হয়। ডেটাটি ডিস্কে এভাবে প্রকাশ করা হবে:

Partition 1:
IncidentKey    Date
ABC123        1/1/2010
ABC123        1/1/2011
XYZ999        1/1/2010

Partition 2:
IncidentKey    Date
ABC123        7/1/2010
XYZ999        7/1/2010

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

কোনও অ-ক্লাস্টারযুক্ত সূচকের যে কোনও সারিটিতে ক্লাস্টারড ইনডেক্স কী থাকবে যার সাথে এটি মিলবে, বলুন ABC123,7/1/2010। যেহেতু ক্লাস্টারড ইনডেক্স কী সর্বদা বিভাজন কী কলামটি ধারণ করে, ইঞ্জিন সর্বদা জানবে যে ক্লাস্টারড সূচির কোন পার্টিশন (রোউসেট) এই মানটি অনুসন্ধান করবে (এই ক্ষেত্রে, পার্টিশন 2 এ)।

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

  • অ-প্রান্তিককরণ সূচিগুলিকে নির্দিষ্ট ক্যোয়ারী পরিকল্পনার জন্য প্রচুর পরিমাণে মেমরির প্রয়োজন
  • নন-অ্যালাইনড ইনডেক্সগুলি দক্ষ পার্টিশন স্যুইচ অপারেশনগুলিকে প্রতিরোধ করে

সারিবদ্ধ সূচকগুলি ব্যবহার করা এই সমস্যাগুলি সমাধান করে, তবে এটির নিজস্ব সমস্যাগুলি নিয়ে আসে, কারণ এই শারীরিক, স্টোরেজ ডিজাইন, বিকল্পটি ডেটা মডেলটিতে ছড়িয়ে পড়ে:

  • সারিবদ্ধ সূচীর অর্থ অনন্য বাধা আর তৈরি করা / প্রয়োগ করা যাবে না (পার্টিশন কলাম ব্যতীত)
  • পার্টিশনযুক্ত টেবিলকে উল্লেখ করে সমস্ত বিদেশী কীগুলির মধ্যে অবশ্যই পার্টিশন কীটি সম্পর্কের মধ্যে অন্তর্ভুক্ত করা উচিত (যেহেতু পার্টিশন কীটি প্রতিটি সূচকে সারিবদ্ধ হওয়ার কারণে ), এবং এর পরিবর্তে আবশ্যক যে সমস্ত টেবিলগুলি পার্টিশনযুক্ত টেবিলের রেফারেন্সিংয়ে পার্টিশন কী কী কলাম মান থাকতে পারে। মনে Orders-> OrderDetails, যদি আদেশ OrderID আছে কিন্তু OrderDate দ্বারা বিভক্ত করা হয়, তাহলে OrderDetails না শুধুমাত্র OrderID কিন্তু থাকা আবশ্যক এছাড়াও OrderDate, সঠিকভাবে করার জন্য ফরেইন কী বাধ্যতা ঘোষণা।

এই প্রভাবগুলি আমি খুব কমই দেখতে পেলাম যে একটি প্রকল্পের শুরুতে পার্টিশন স্থাপন করে, তবে সেগুলি উপস্থিত রয়েছে এবং এর গুরুতর পরিণতি রয়েছে।

আপনি যদি ভাবেন যে সারিবদ্ধ সূচকগুলি একটি বিরল বা চরম ক্ষেত্রে, তবে এটি বিবেচনা করুন: অনেক ক্ষেত্রে ETL এর ভিত্তি এবং পার্টিশন সমাধানগুলি মঞ্চ টেবিলগুলির দ্রুত সুইচ। ক্রিয়াকলাপে স্যুইচ করার জন্য সারিবদ্ধ সূচকগুলি প্রয়োজন।

ওহ, আরও একটি জিনিস: বিদেশী কীগুলি সম্পর্কে আমার সমস্ত যুক্তি এবং অন্যান্য টেবিলগুলিতে পার্টিশন কলামের মান যুক্ত করার লম্বা প্রভাবটি যোগদানের ক্ষেত্রেও সমানভাবে প্রযোজ্য ।


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

সাধারণত পার্টিশন সুইচ অপারেশনগুলির সুবিধাগুলি সমস্ত সমস্যার চেয়ে বেশি।
রিমাস রুসানু

এটা আমাদের আশা, আমরা শীঘ্রই দেখতে পাবেন!
জেএনকে

9

যখন ক্লাস্টারড ইনডেক্সের একাধিক পার্টিশন থাকে, প্রতিটি পার্টিশনে একটি বি-ট্রি কাঠামো থাকে যা সেই নির্দিষ্ট পার্টিশনের ডেটা ধারণ করে। উদাহরণস্বরূপ, যদি একটি ক্লাস্টার ইনডেক্সের চারটি পার্টিশন থাকে তবে চারটি বি-ট্রি কাঠামো রয়েছে; প্রতিটি বিভাগে একটি। সূত্র। ক্লাস্টারড ইনডেক্স স্ট্রাকচারস

পার্টিশনযুক্ত সূচকগুলির জন্য বিশেষ নির্দেশিকা

আপনি পার্টিশনযুক্ত সূচকের নির্দিষ্ট পার্টিশনগুলি পুনরায় তৈরি করতে পারেন।

যেমন

ALTER INDEX IX_TransactionHistory_TransactionDate
ON Production.TransactionHistory
REBUILD Partition = 5;
GO

লিঙ্কটির জন্য +1, আমি বিশেষ গাইডলাইন পড়েছি কিন্তু সেই অনুচ্ছেদটি মিস করেছি। ফলোআপ প্রশ্ন - আমরা IncidentKeyমাঠে প্রচুর সংহতকরণ করি, আপনি কি মনে করেন এটি কার্যকারিতা উপর বিরূপ প্রভাব ফেলবে (আমি বুঝতে পারি যে এখনও আমার পরীক্ষার প্রয়োজন হবে)?
জেএনকে

আমি আপনার সমস্ত নির্দিষ্ট পরিস্থিতি জানি না তবে এটি আমাকে আঘাত করে আপনি ইনসিডেন্টডেট দ্বারা বিভাজন করা ভাল হতে পারে?
মিচ গম

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