Mam tabelę programu SQL Server 2014, która wygląda następująco:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
Niektórzy członkowie mojego zespołu sugerowali, że indeks klastrowany powinien być włączony OrderId
, ale myślę, że CustomerId
+ OrderId
byłby lepszym wyborem z następujących powodów:
- Prawie wszystkie zapytania będą wyglądały
WHERE CustomerId = @param
, nieOrderId
CustomerId
jest kluczem obcym doCustomer
tabeli, więc indeks klastrowany zCustomerId
powinien przyspieszyć złączenia- Chociaż
CustomerId
nie jest unikalny, podanie dodatkowejOrderId
kolumny w indeksie zapewni unikalność (możemy użyćUNIQUE
słowa kluczowego podczas tworzenia indeksu klastrowego na tych 2 kolumnach, aby uniknąć narzutu związanego z brakiem unikatowości) - Po wstawieniu danych
CustomerId
iOrderId
nigdy się nie zmieniają, więc te wiersze nie będą się przesuwać po pierwszym zapisie. - Dostęp do danych odbywa się za pośrednictwem ORM, który domyślnie żąda wszystkich kolumn, więc gdy pojawi się zapytanie oparte na
CustomerId
indeksie, klastrowany indeks będzie w stanie dostarczyć wszystkie kolumny bez dodatkowej pracy.
Czy podejście CustomerId
i OrderId
wydaje się najlepszą opcją, biorąc pod uwagę powyższe? A może jest OrderId
lepszy, ponieważ jest to pojedyncza kolumna, która sama gwarantuje wyjątkowość?
Obecnie tabela ma indeks klastrowany OrderId
i indeks nieklastrowy włączony CustomerId
, ale nie obejmuje, więc ponieważ używamy ORM i wymagane są wszystkie kolumny, odzyskanie ich jest dodatkową pracą. Więc w tym poście staram się rozważyć poprawę wydajności dzięki lepszemu CI.
Aktywność na naszym DB wynosi około 85% odczytów i 15% zapisów.