У меня есть таблица 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% операций записи.