আমার একটি এসকিউএল সার্ভার 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
CustomerId
Customer
টেবিলের জন্য একটি বিদেশী কী , সুতরাং একটি ক্লাস্টারড ইনডেক্সCustomerId
থাকা গতিবেগ হওয়া উচিত- যদিও
CustomerId
অনন্য নয়, অতিরিক্ত থাকারOrderId
সূচক নির্দিষ্ট কলামের স্বতন্ত্রতা নিশ্চিত করবে (আমরা ব্যবহার করতে পারেনUNIQUE
যখন সেই 2 কলাম উপর ক্লাস্টার সূচক তৈরি কীওয়ার্ডটি স্বতন্ত্রতা হচ্ছে না এর ওভারহেড এড়াতে) - একবার ডেটা isোকানো হয়ে গেলে
CustomerId
এবংOrderId
কখনই পরিবর্তন হয় না, তাই প্রাথমিকভাবে লেখার পরে এই সারিগুলি ঘোরাফেরা করবে না। - ডেটা অ্যাক্সেস একটি ওআরএম এর মাধ্যমে ঘটে যা ডিফল্টরূপে সমস্ত কলামের জন্য অনুরোধ করে, সুতরাং যখন
CustomerId
ক্লাসড ইনডেক্স কোনও অতিরিক্ত কাজ ছাড়াই সমস্ত কলাম সরবরাহ করতে সক্ষম হবে on
না CustomerId
এবং OrderId
সবচেয়ে ভাল বিকল্প মত পদ্ধতির শব্দ দেওয়া উপরোক্ত? বা, OrderId
নিজের থেকে আরও ভাল, যেহেতু এটি একটি একক কলাম যা নিজেই স্বতন্ত্রতার গ্যারান্টি দিচ্ছে?
বর্তমানে, টেবিলটিতে একটি ক্লাস্টারড ইনডেক্স রয়েছে OrderId
, এবং একটি অবিবাহিত সূচক রয়েছে CustomerId
, তবে এটি আবরণ করছে না, সুতরাং যেহেতু আমরা একটি ORM ব্যবহার করছি এবং সমস্ত কলামকে অনুরোধ করা হয়েছে, সেগুলি পুনরুদ্ধার করা অতিরিক্ত কাজ। তাই এই পোস্টের সাথে, আমি আরও ভাল সিআই দিয়ে পারফরম্যান্স উন্নত করার বিষয়টি বিবেচনা করার চেষ্টা করছি।
আমাদের ডিবিতে ক্রিয়াকলাপ প্রায় 85% পড়ে এবং 15% লেখেন।