ক্লাস্টার্ড সূচক নির্বাচন - পিকে বা এফকে?


11

আমার একটি এসকিউএল সার্ভার 2014 সারণী রয়েছে যা নিম্নলিখিতগুলির মতো দেখাচ্ছে:

OrderId     int           not null IDENTITY --this is the primary key column
OrderDate   datetime2     not null
CustomerId  int           not null
Description nvarchar(255) null

আমার টিমের কিছু লোক পরামর্শ দিয়েছেন যে ক্লাস্টারড ইনডেক্স চালু রাখা উচিত OrderId, তবে আমি মনে করি যে CustomerId+ OrderIdনিম্নলিখিত কারণে আরও ভাল পছন্দ হবে:

  • প্রায় সব প্রশ্নের সন্ধান করা হবে WHERE CustomerId = @param, নাOrderId
  • CustomerIdCustomerটেবিলের জন্য একটি বিদেশী কী , সুতরাং একটি ক্লাস্টারড ইনডেক্স CustomerIdথাকা গতিবেগ হওয়া উচিত
  • যদিও CustomerIdঅনন্য নয়, অতিরিক্ত থাকার OrderIdসূচক নির্দিষ্ট কলামের স্বতন্ত্রতা নিশ্চিত করবে (আমরা ব্যবহার করতে পারেন UNIQUEযখন সেই 2 কলাম উপর ক্লাস্টার সূচক তৈরি কীওয়ার্ডটি স্বতন্ত্রতা হচ্ছে না এর ওভারহেড এড়াতে)
  • একবার ডেটা isোকানো হয়ে গেলে CustomerIdএবং OrderIdকখনই পরিবর্তন হয় না, তাই প্রাথমিকভাবে লেখার পরে এই সারিগুলি ঘোরাফেরা করবে না।
  • ডেটা অ্যাক্সেস একটি ওআরএম এর মাধ্যমে ঘটে যা ডিফল্টরূপে সমস্ত কলামের জন্য অনুরোধ করে, সুতরাং যখন CustomerIdক্লাসড ইনডেক্স কোনও অতিরিক্ত কাজ ছাড়াই সমস্ত কলাম সরবরাহ করতে সক্ষম হবে on

না CustomerIdএবং OrderIdসবচেয়ে ভাল বিকল্প মত পদ্ধতির শব্দ দেওয়া উপরোক্ত? বা, OrderIdনিজের থেকে আরও ভাল, যেহেতু এটি একটি একক কলাম যা নিজেই স্বতন্ত্রতার গ্যারান্টি দিচ্ছে?

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

আমাদের ডিবিতে ক্রিয়াকলাপ প্রায় 85% পড়ে এবং 15% লেখেন।

উত্তর:


5

সম্প্রদায় উইকি উত্তর :

আমি মনে করি সঙ্গে একটি যৌগিক ক্লাস্টার সূচক কী CustomerID প্রথম কলাম হিসাবে সবচেয়ে বেশি ভালো করবে যেহেতু যে এর WHEREপ্রায় সব প্রশ্নের ধারা।

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

আপনার সবচেয়ে সমালোচনামূলক প্রশ্নের উপর নির্ভর করে অর্ডারআইডি বা অর্ডারডেট দ্বিতীয় কলামের জন্য সেরা হতে পারে।

উদাহরণস্বরূপ, গ্রাহকরা যদি কোনও ওয়েবসাইটে লগ ইন করার পরে সাম্প্রতিক আদেশগুলির ক্রনিকোলজিকাল তালিকাটি দেখতে পান তবে অর্ডারডেটটি অপ্টিমাইজ করার জন্য পরবর্তী হওয়া উচিত ORDER BY OrderDate DESC

আপনি যদি OrderID এ কোনো অ-ক্লাস্টার সূচক সঙ্গে, ক্লাস্টার সূচক যেমন CustomerID , আপনি কি এখনও দু'ভাগ হয়ে ফ্র্যাগমেন্টেশন পাবেন, শুধু অ ক্লাস্টার সূচক।


3

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

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

আপনি যদি মনে করেন গ্রাহকআইডি একটি যৌগিক ক্লাস্টারড সূচকের শীর্ষস্থানীয় কলাম হওয়া উচিত, আপনি FILLFACTORএই সারণির জন্য সমস্ত সূচীতে সামঞ্জস্য করে মিড-পৃষ্ঠা বিভাজনের প্রভাব হ্রাস করতে পারবেন । এটি সারণী / সূচকের আকার বাড়িয়ে মিডপেজ বিভাজনের পরিমাণ হ্রাস করবে। আপনি যদি এই পথে যেতে চান তবে আমি 80 এর মান দিয়ে পরীক্ষা করার পরামর্শ দিচ্ছি এবং যদি বিশ্লেষণের মধ্য পৃষ্ঠার বিভাজনগুলি এখনও কর্মক্ষমতা হারাতে দেখায় তবে হ্রাস করতে পারি।

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

আমাদের ডিবিতে ক্রিয়াকলাপ প্রায় 85% পড়ে এবং 15% লেখেন।

CustomerID+ OrderID(এবং কোনও বিভাজন ছাড়াই বৃদ্ধির জন্য একটি ফিলফ্যাক্টর নির্দিষ্ট করে দেওয়া) যদি সেই মূল্যায়ন সত্য হয় তবে সম্ভবত এটি আরও ভাল। মূল্যায়ন সঠিক কিনা তা নিশ্চিত করুন । পরীক্ষার পরীক্ষা।


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