Moja znajomość SQL na niższym poziomie (Server 2008) jest ograniczona i obecnie jest to wyzwanie dla naszych administratorów baz danych. Pozwól mi wyjaśnić (wspomniałem o oczywistych stwierdzeniach w nadziei, że mam rację, ale jeśli widzisz coś nie tak, powiedz mi) scenariusz:
Mamy stół, na którym znajdują się „nakazy sądowe” dla ludzi. Kiedy tworzyłem tabelę (Name: CourtOrder), utworzyłem ją w następujący sposób:
CREATE TABLE dbo.CourtOrder
(
CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key)
PersonId INT NOT NULL,
+ around 20 other fields of different types.
)
Następnie zastosowałem indeks nieklastrowy do klucza podstawowego (w celu zwiększenia wydajności). Powodem jest to, że jest to unikalne pole (klucz podstawowy) i powinno być indeksowane, głównie w celu selekcji, ponieważ częstoSelect from table where primary key = ...
Następnie zastosowałem indeks CLUSTERED na PersonId. Powodem było fizyczne grupowanie zamówień dla konkretnej osoby, ponieważ zdecydowana większość pracy to uzyskiwanie zamówień na osobę. Więc,select from mytable where personId = ...
Zostałem w tym teraz wciągnięty. Powiedziano mi, że powinniśmy umieścić indeks klastrowy na kluczu podstawowym, a normalny indeks na personId. Wydaje mi się to bardzo dziwne. Po pierwsze, dlaczego miałbyś umieścić indeks klastrowy w unikalnej kolumnie? co to jest klaster? Z pewnością to strata indeksu klastrowego? Myślałem, że w unikalnej kolumnie zostanie użyty normalny indeks. Ponadto grupowanie indeksu oznaczałoby, że nie możemy grupować różnych kolumn (po jednej na tabelę, prawda?).
Powodem, dla którego powiedziano mi, że popełniłem błąd, jest to, że uważają, że umieszczenie grupowanego indeksu na PersonId spowolniłoby wstawianie. W przypadku 5% wzrostu szybkości wybranego elementu uzyskalibyśmy 95% spadek szybkości wstawiania i aktualizacji. Czy to jest poprawne i ważne?
Mówią, że ponieważ tworzymy grupę personId, SQL Server musi zmienić kolejność danych za każdym razem, gdy wstawiamy lub zmieniamy PersonId.
Więc zapytałem, dlaczego SQL miałby mieć pojęcie INDEKSU KLASTEROWEGO, skoro jest tak wolny? Czy jest tak wolno, jak mówią? Jak należy skonfigurować indeksy, aby uzyskać optymalną wydajność? Myślałem, że SELECT jest używany częściej niż INSERT ... ale mówią, że mamy problemy z blokowaniem na INSERTS ...
Mam nadzieję, że ktoś może mi pomóc.