У меня есть таблица 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
ключевое слово при создании кластеризованного индекса для этих двух столбцов, чтобы избежать издержек, связанных с отсутствием уникальности) - После того как данные вставлено,
CustomerId
иOrderId
никогда не изменится, так что эти строки не будут двигаться вокруг после первоначальной записи. - Доступ к данным происходит через ORM, который запрашивает все столбцы по умолчанию, поэтому, когда
CustomerId
поступает запрос на основе , кластерный индекс сможет предоставить все столбцы без какой-либо дополнительной работы.
Ли CustomerId
и OrderId
данный подход звучит как лучший вариант выше? Или OrderId
лучше сам по себе, поскольку это один столбец, который сам по себе гарантирует уникальность?
В настоящее время для таблицы включен кластеризованный индекс OrderId
и некластеризованный индекс CustomerId
, но он не охватывает, поэтому, поскольку мы используем ORM и запрашиваем все столбцы, их дополнительная работа требует дополнительной работы. Итак, в этом посте я пытаюсь рассмотреть вопрос об улучшении производительности с помощью лучшего CI.
Активность в нашей БД составляет около 85% операций чтения и 15% операций записи.