Implikacje użycia unikalnego nieklastrowanego indeksu z pokrywającymi kolumnami zamiast klucza podstawowego


12

Mamy dużą tabelę, [MyTable]która ma obecnie zarówno a Primary Key, jak i jedną Unique Non Clustered Indexw tej samej kolumnie ( [KeyColumn]). Indeks U NC ma również dodatkowe kolumny zakrywające.

Posiadanie zarówno PK, jak i Unikalnego Indeksu NC w tych samych kolumnach wydaje się zbędne, dlatego rozważałem usunięcie Klucza Głównego i zamiast tego użyłem Unikatowego Nieklastrowanego indeksu do celów integralności referencyjnej.

Zauważ, że tabela jest całkowicie skupiona w innej kolumnie.

tzn. mamy:

ALTER TABLE [MyTable]
    ADD CONSTRAINT [PK_MyTable] 
    PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO

I

CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex] 
    ON [MyTable] ([KeyColumn]) 
    INCLUDE ([Column1], [Column2])
GO

O ile mi wiadomo, nie można dodawać kolumn zakrywających do klucza podstawowego, więc zamierzam zrobić:

  • Usuń zależne od klucza obcego ograniczenia MyTable.KeyColumn
  • Upuść MyTable.KeyColumncałkowicie klucz podstawowy
  • Ponownie dodaj klucze obce do tabeli (tzn. RI będzie wymuszone przez MyTable.KeyColumn)

Jedyną implikacją, jaką mogę o tym myśleć, jest to, że nie dostaniemy symbolu klucza wizualnego na naszych schematach ERD i że gęstość indeksu (liścia) będzie mniejsza z powodu uwzględnionych kolumn.

Przeczytałem /programming/487314/primary-key-or-unique-index i cieszę się z integralności i wydajności związanych z tym działań.

Moje pytanie brzmi: czy to podejście jest wadliwe?

Edytuj Co próbuję osiągnąć : Optymalizacja wydajności i Wiosenne porządki . Po usunięciu PK lub indeksu, moje indeksy będą wymagały mniej stron = szybsze zapisy, a także korzyści konserwacyjne / operacyjne, tj. Jeden mniej indeksu do defragmentacji itp.

Aby dodać trochę tła, nigdy wcześniej nie miałem tabeli, do której się odwołujemy, bez PK. Jednak fakt, że do tabeli dodano indeks NC z przykrywającymi kolumnami, oznacza, że ​​muszę dostosować swoje myślenie.


Czy mógłbyś skomentować to, co próbujesz osiągnąć? Powinieneś także upewnić się, że skończysz z indeksem klastrowym na końcu.

@ jn29098 - zaktualizowano. Potwierdzono, że mamy indeks klastrowy na kolumnach, które nie są ani PK, ani kolumnami pokrywającymi, więc nie wydaje się to istotne dla tej decyzji.
— StuartLC

1
Jesteś pewien, że nie masz żadnego narzędzia do modelowania / ORM / generowania danych, które zablokowałoby się, gdy zobaczył PK?
— Remus Rusanu

Jedyną wadą, którą widzę, jest to, że gdy PK zniknie. Następnie masz tylko jeden indeks w keycolumn, a zapytania, które używają indeksu PK, powiedzmy, że do skanowania indeksu w keycolumn lub porządkowania według keycolumn i nie są objęte indeksem Uniuqe mogą taktować nieco więcej IO ponieważ unikalne strony z listami indeksu są znacznie większe niż w PK. W przeciwnym razie wygląda dobrze. Ale jakiś purysta powie, że powinieneś mieć PK :)
— Gulli Meel

1
Sugerowałbym sprawdzenie przydatności tego indeksu za pomocą statystyk użytkowania indeksu DMV i sprawdzenie, czy jest on używany przez niektóre z twoich zapytań. Sprawdź go również w odniesieniu do unikalnego indeksu klucza, a następnie określ, co stanie się z zapytaniem za pomocą tego zapytania indeks ..
— Gulli Meel

Odpowiedzi:


3

Optymalizacja wydajności. Po usunięciu PK lub indeksu, moje indeksy będą wymagały mniej stron = szybsze zapisy, a także korzyści konserwacyjne / operacyjne, tj. Jeden mniej indeksu do defragmentacji itp.

Musisz być w stanie udowodnić, że to, co jest proponowane, rzeczywiście pomoże (koszt vs. korzyść). Z jakiego powodu rozważana jest ta zmiana? Czy rzeczywiście występują problemy z wydajnością tej tabeli, czy po prostu „wyglądają źle”?

Oto kilka innych pytań, które pomogą Ci podjąć najlepszą decyzję dla twojego środowiska:

  • Ile czasu można by zaoszczędzić w oknie konserwacji? W oknie kopii zapasowej?

  • Ile miejsca to zaoszczędziłoby (pliki danych, pliki dziennika, kopie zapasowe itp.)?

  • Czy INSERTwydajność na tym stole jest teraz naprawdę wąskim gardłem? Ile by to poprawiło? Czy usunięcie indeksu jest najlepszą strategią, aby rozwiązać ten problem?

  • Czy spowoduje to problemy z narzędziami i strukturami baz danych (szczególnie ORM), które oczekują, że każda tabela będzie miała klucz podstawowy, a nie tylko unikalny indeks? Replikacja transakcyjna wymaga klucza podstawowego w opublikowanych tabelach.

  • Czy ważny jest samodokumentujący schemat bazy danych?

  • Mimo ograniczonego wykorzystania, czy zawężenie indeksu klucza głównego nadal pozwala optymalizatorowi na tworzenie bardziej wydajnych planów dla niektórych zapytań? (Użyj, sys.dm_db_index_usage_statsaby się dowiedzieć.)

Osobiście, z tego, co nam powiedziałeś, zostawiłbym to w spokoju, dopóki nie zostanie udowodnione, że zarówno (a) dodatkowy indeks stanowi problem, a (b) usunięcie go jest rozwiązaniem.


Dzięki - okazuje się, że statystyki indeksu pokazały, że PK nadal był intensywnie wykorzystywany do skanowania. Wygląda na to, że byłem nadgorliwy - korzyści wynikające z czytelności / konwencji wynikające z zachowania PK powinny w dłuższej perspektywie przeważać nad implikacjami dotyczącymi przechowywania. Chodzi jednak o replikację transakcyjną - wkrótce będziemy musieli replikować tę bazę danych.
— StuartLC

2

Jedynym rodzajem zapytania w tej tabeli, który będzie działał gorzej (i tylko nieco gorzej), będą te, które żądają zakresu wartości KeyColumn - ponieważ te zapytania najlepiej byłoby teraz obsłużyć przez wyszukiwanie indeksu w twoim PK.

Warto pamiętać, że koszt sprawdzania integralności referencyjnej dla tabel, które odnoszą się do tej tabeli, będzie wyższy (ponownie tylko nieznacznie wyższy).

Tak długo, jak dbasz o aspekt zerowy, powinieneś być w porządku z jednym indeksem.

Gdyby to był mój DB, prawdopodobnie wybrałbym pojedynczy unikalny indeks, wszystkie inne rzeczy byłyby równe.


Dzięki - czy masz jakieś odnośniki? wrt nieco gorzej, czy masz na myśli wyłącznie niższą gęstość indeksu we wskaźniku pokrycia, czy jest coś innego, co by to spowodowało?
— StuartLC

Niestety, to po prostu wiele doświadczeń i rozmowa z ludźmi znacznie mądrzejszymi ode mnie przez lata! I tak, właśnie to - na stronie będzie mniej wierszy, więc więcej I / O. Warto jednak zauważyć, że kolumny INCLUDE są obecne tylko na poziomie liścia. Więc nie jest tak źle. Jestem pewien, że wiesz o tym na podstawie szczegółów pytania, ale zgaduję, że inni czytelnicy mogą tego nie wiedzieć.
— Matt Whitfield

-2

O ile mi wiadomo, nie można dodawać kolumn zakrywających do klucza podstawowego

Jeśli masz indeks klastrowy w KeyColumn, ponieważ jest to indeks klastrowany, wszystkie pozostałe kolumny są domyślnie „zakryte”. Więc nic nie zyskujesz, dodając kolejny indeks do KeyColumn. W rzeczywistości spowolnisz wkładki i zużyjesz więcej miejsca.

Wynika to z faktu, że indeks klastrowany nie jest indeksem jako takim, lecz jedynie instrukcją do przechowywania wierszy tabeli w kolejności indeksu. A kiedy już znajdziesz wiersz po kluczu podstawowym, masz już wszystkie inne kolumny.


2
Z akapitu pierwszego:The table is clustered by another column entirely.
— JNK

5
Myślę, że może tu wystąpić pewne zamieszanie związane z kluczem podstawowym / indeksem klastrowym. Pomimo najlepszych starań studia zarządzania, aby cię przekonać, to nie to samo.
— Matt Whitfield
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.