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+ OrderIdbyłby lepszym wyborem z następujących powodów:
- Prawie wszystkie zapytania będą wyglądały
WHERE CustomerId = @param, nieOrderId CustomerIdjest kluczem obcym doCustomertabeli, więc indeks klastrowany zCustomerIdpowinien przyspieszyć złączenia- Chociaż
CustomerIdnie jest unikalny, podanie dodatkowejOrderIdkolumny w indeksie zapewni unikalność (możemy użyćUNIQUEsłowa kluczowego podczas tworzenia indeksu klastrowego na tych 2 kolumnach, aby uniknąć narzutu związanego z brakiem unikatowości) - Po wstawieniu danych
CustomerIdiOrderIdnigdy 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
CustomerIdindeksie, klastrowany indeks będzie w stanie dostarczyć wszystkie kolumny bez dodatkowej pracy.
Czy podejście CustomerIdi OrderIdwydaje się najlepszą opcją, biorąc pod uwagę powyższe? A może jest OrderIdlepszy, ponieważ jest to pojedyncza kolumna, która sama gwarantuje wyjątkowość?
Obecnie tabela ma indeks klastrowany OrderIdi 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.