Wiele indeksów vs indeksy wielokolumnowe

Właśnie dodałem Indeks do tabeli w SQL Server 2005 i dało mi to do myślenia. Jaka jest różnica między utworzeniem 1 indeksu a zdefiniowaniem wielu kolumn w stosunku do posiadania 1 indeksu na kolumnę, którą chcesz zindeksować.

Czy są jakieś powody, dla których jedno powinno być używane nad drugim?

Na przykład

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

Kontra

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)
Author: GateKiller, 2008-10-07

6 answers

Zgadzam się z Cade Roux .

Ten artykuł powinien ci pomóc:

Należy zauważyć, że indeksy klastrowe powinny mieć unikalny klucz (kolumnę tożsamości, którą polecam) jako pierwszą kolumnę. Zasadniczo pomaga wstawić dane na końcu indeksu i nie powoduje wielu IO dysku i Podział stron.

Po drugie, jeśli tworzysz inne indeksy na swoich danych i są one sprytnie skonstruowane, zostaną one ponownie wykorzystane.

Np. wyobraź sobie, że przeszukujesz tabelę na trzech kolumnach

Stan, Hrabstwo, zip.

  • czasami wyszukujesz tylko według stanu.
  • Czasami wyszukujesz według stanu i hrabstwa.
  • często wyszukujesz według stanu, hrabstwa, zip.

Następnie Indeks z state, county, zip. będą stosowane we wszystkich trzech z nich / align = "left" /

Jeśli przeszukiwasz sam zip dość często, powyższy indeks nie będzie używany (i tak przez SQL Server), ponieważ zip jest trzecią częścią tego indeksu, a optymalizator zapytań nie zobaczy tego indeksu jako pomocnego.

Możesz następnie utworzyć indeks na samym Zip, który będzie używany w tej instancji.

Myślę, że odpowiedź, której szukasz, jest taka, że zależy to od Twojego, gdzie klauzule często używanych zapytań, a także twojej grupy przez.

Artykuł pomoże a Nr serii :-)

 246
Author: evilhomer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:36

Tak. Polecam zajrzeć do artykułów Kimberly Tripp na temat indeksowania.

Jeśli indeks jest "covering", to nie ma potrzeby używać niczego poza indeksem. W SQL Server 2005, można również dodać dodatkowe kolumny do indeksu, które nie są częścią klucza, co może wyeliminować podróże do reszty wiersza.

Posiadanie wielu indeksów, każdy w jednej kolumnie może oznaczać, że w ogóle używany jest tylko jeden indeks - musisz odwołać się do planu wykonania, aby zobaczyć, co efekty różne systemy indeksowania oferują.

Możesz również użyć kreatora strojenia, aby pomóc określić, które indeksy sprawią, że dane zapytanie lub obciążenie będzie działać najlepiej.

 63
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-19 19:45:04

Indeks wielokolumnowy może być używany do zapytań odwołujących się do wszystkich kolumn:

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

Można to sprawdzić bezpośrednio za pomocą wielokolumnowego indeksu. Z drugiej strony, można użyć co najwyżej jednego indeksu jednokolumnowego(musiałby wyszukać wszystkie rekordy posiadające Column1=1, a następnie sprawdzić Column2 i Column3 w każdym z nich).

 31
Author: MobyDX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 15:46:51

Jeden element, który wydaje się być pominięty, to transformacje gwiazd. przecięcie indeksu operatory rozwiązują predykat, obliczając zbiór wierszy trafionych przez każdy z predykatów, zanim jakiekolwiek wejścia / Wyjścia zostaną wykonane w tabeli faktów. Na schemacie Gwiazdy można indeksować każdy pojedynczy klucz wymiaru, a optymalizator zapytań może określić, które wiersze wybrać przez obliczenie przecięcia indeksu. Indeksy na poszczególnych kolumnach zapewniają najlepszą elastyczność w tym zakresie.

 13
Author: ConcernedOfTunbridgeWells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 19:19:31

Jeśli masz zapytania, które będą często używać stosunkowo statycznego zestawu kolumn, utworzenie pojedynczego indeksu pokrycia, który zawiera je wszystkie, znacznie poprawi wydajność.

Poprzez umieszczenie wielu kolumn w indeksie, optymalizator będzie miał bezpośredni dostęp do tabeli tylko wtedy, gdy kolumna nie znajduje się w indeksie. Często używam ich w hurtowniach danych. Minusem jest to, że robienie tego może kosztować wiele kosztów ogólnych, zwłaszcza jeśli dane są bardzo niestabilne.

Tworzenie indeksy na pojedynczych kolumnach są przydatne do operacji wyszukiwania często spotykanych w systemach OLTP.

Powinieneś zadać sobie pytanie, dlaczego indeksujesz kolumny i jak będą używane. Uruchom niektóre plany zapytań i sprawdź, kiedy są dostępne. Strojenie indeksu to tak samo instynkt jak nauka.

 5
Author: Bob Probst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 15:46:19

Lahdenmaki i książka Leacha "Relational Database Index Design and the Optimizers" wprowadza trzygwiazdkowy system klasyfikacji, jak odpowiedni jest indeks dla zapytania.

  1. indeks zarabia jedną gwiazdkę, jeśli umieszcza odpowiednie wiersze sąsiadujące ze sobą
  2. druga gwiazdka, jeśli jej wiersze są posortowane w kolejności, jakiej wymaga zapytanie
  3. Ostatnia gwiazdka, jeśli zawiera wszystkie kolumny potrzebne do zapytania

Tworzenie wielu indeksów na kolumnach, ta strategia indeksowania często wyniki, gdy ludzie udzielają niejasnych, ale autorytatywnie brzmiących porad, takich jak " tworzenie indeksów na kolumnach, które pojawiają się w klauzuli WHERE."Ta rada jest bardzo zła. Będzie to skutkować jednogwiazdkowymi indeksami w najlepszym razie. Indeksy te mogą być o wiele rzędów wielkości wolniejsze niż indeksy naprawdę optymalne. Czasami, gdy nie można zaprojektować indeksu trzygwiazdkowego, znacznie lepiej zignorować klauzulę WHERE i zwrócić uwagę na optymalną kolejność wierszy lub utworzyć indeks pokrycia.

 0
Author: hechen0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-15 13:23:46