У мене є таблиця SQL Server 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 стовпцях, щоб уникнути накладності неповторності) - Щойно дані вставляються,
CustomerId
іOrderId
ніколи не змінюються, тому ці рядки не рухатимуться після початкового запису. - Доступ до даних відбувається через ORM, який запитує всі стовпці за замовчуванням, тож коли
CustomerId
надходить запит на основі , кластерний індекс зможе надати всі стовпці без додаткової роботи.
Чи звучить підхід CustomerId
і OrderId
як найкращий варіант з огляду на вищезазначене? Або, що саме OrderId
по собі краще, оскільки це єдина колонка, яка гарантує унікальність сама по собі?
В даний час у таблиці є кластерний індекс OrderId
і некластеризований індекс на CustomerId
, але він не охоплює, тому оскільки ми використовуємо ORM і всі стовпці запитуються, додатково потрібно їх відновити. Тому в цій публікації я намагаюся розглянути можливість підвищення продуктивності з кращим ІС.
Активність у нашій БД становить близько 85% читань та 15% записів.