У мене є таблиця 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% записів.