আমার একটি এসকিউএল সার্ভার 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% লেখেন।