Jakie są różnice między indeksem klastrowym a nieklastrowym?

Jakie są różnice między clustered a non-clustered index?

Author: DineshDB, 2008-09-18

10 answers

Clustered Index

  • tylko jeden na tabelę
  • szybsze odczytywanie niż nie klastrowane, ponieważ dane są fizycznie przechowywane w kolejności indeksów

Non Clustered Index

  • może być używany wiele razy w tabeli
  • szybsze operacje wstawiania i aktualizacji niż indeks klastrowy

Oba typy indeksu poprawią wydajność przy wybraniu danych z polami, które używają indeksu, ale spowolnią operacje aktualizacji i wstawiania.

Z powodu wolniejszego Wstaw i update klastrowe indeksy powinny być ustawione na polu, które zwykle jest przyrostowym ID ie lub znacznikiem czasu.

SQL Server zwykle używa indeksu tylko wtedy, gdy jego selektywność wynosi powyżej 95%.

 233
Author: Martynnw,
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
2012-05-02 11:57:13

Klastrowe indeksy fizycznie porządkują dane na dysku. Oznacza to, że dla indeksu nie są potrzebne żadne dodatkowe dane, ale może być tylko jeden klastrowy indeks (oczywiście). Dostęp do danych za pomocą klastrowego indeksu jest najszybszy.

Wszystkie pozostałe indeksy muszą być nieklastrowane. Indeks nieklastrowany ma duplikat danych z indeksowanych kolumn uporządkowanych razem ze wskaźnikami do rzeczywistych wierszy danych(wskaźniki do indeksu klastrowego, jeśli taki istnieje). Oznacza to, że dostęp do danych poprzez nieklastrowany indeks musi przejść przez dodatkową warstwę indeksu. Jeśli jednak wybierzesz tylko dane dostępne w zindeksowanych kolumnach, możesz je odzyskać bezpośrednio z zduplikowanych danych indeksu (dlatego dobrze jest wybrać tylko te kolumny, których potrzebujesz, a których nie używasz *)

 68
Author: rslite,
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-09-18 11:24:10

Clustered indeksy są przechowywane fizycznie w tabeli. Oznacza to, że są one najszybsze i możesz mieć tylko jeden klastrowy indeks na tabelę.

Nieklastrowane indeksy są przechowywane oddzielnie i możesz mieć ich tyle, ile chcesz.

Najlepszą opcją jest ustawienie indeksu klastrowego na najczęściej używanej unikalnej kolumnie, Zwykle PK. Zawsze powinieneś mieć dobrze dobrany, klastrowy indeks w swoich tabelach, chyba że jest to bardzo przekonujący powód ... nie mogę wymyślić jednego, ale hej, może to być tam-za to, że tego nie zrobił, wychodzi na jaw.

 31
Author: Santiago Cepas,
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
2011-07-27 10:27:00

Clustered Index

  1. może być tylko jeden klastrowy indeks dla tabeli.
  2. zazwyczaj wykonywane na kluczu głównym.
  3. węzły liścia klastrowego indeksu zawierają Strony danych.

Indeks Bezklasowy

  1. w tabeli może być tylko 249 nieklastrowanych indeksów (do wersji sql 2005 późniejsze wersje obsługują do 999 nieklastrowanych indeksów).
  2. zwykle robione na dowolnym kluczu.
  3. węzeł liścia indeksu nie składa się z strony z danymi. Zamiast tego, węzły liści zawierają wiersze indeksu.
 25
Author: Jojo,
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-08-29 14:22:41

Clustered Index

  • w tabeli może być tylko jeden klastrowy indeks
  • Sortuj rekordy i przechowuj je fizycznie zgodnie z kolejnością
  • Pobieranie danych jest szybsze niż indeksy bez klastrów
  • nie potrzeba dodatkowego miejsca do przechowywania struktury logicznej

Non Clustered Index

  • w tabeli może znajdować się dowolna liczba nieklastrowanych indeksów
  • Nie wpływają na porządek fizyczny. Utwórz logiczny porządek dla wierszy danych i użyj wskaźniki do plików danych fizycznych
  • wstawianie/aktualizacja danych jest szybsze niż indeks klastrowy
  • Użyj dodatkowej przestrzeni do przechowywania struktury logicznej

Oprócz tych różnic musisz wiedzieć, że gdy tabela nie jest klastrowa (gdy tabela nie ma klastrowego indeksu) Pliki Danych są nieuporządkowane i używa struktury danych sterty jako struktury danych.

 19
Author: Lasitha Yapa,
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
2016-06-22 16:29:42

Klasterowanie oznacza w zasadzie, że dane są w tej kolejności w tabeli. Dlatego możesz mieć tylko jeden stół.

Unclustered oznacza, że jest "tylko" logicznym porządkiem.

 8
Author: Biri,
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-09-18 11:20:41

Plusy:

Indeksy klastrowe działają świetnie dla zakresów (np. select * from my_table where my_key between @min and @ max)

W pewnych warunkach DBMS nie będzie musiał pracować nad sortowaniem, jeśli użyjesz instrukcji orderby.

Wady:

Klastrowane indeksy mogą spowolnić wstawianie, ponieważ fizyczne układy rekordów muszą być modyfikowane podczas wprowadzania rekordów, jeśli nowe klucze nie są w kolejności sekwencyjnej.

 6
Author: Giovanni Galbo,
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-09-18 11:22:21

Indeks klastrowy faktycznie opisuje kolejność, w jakiej rekordy są fizycznie przechowywane na dysku, stąd powód, dla którego możesz mieć tylko jeden.

Nieklastrowany indeks definiuje logiczny porządek, który nie pasuje do fizycznego porządku na dysku.

 5
Author: Josh,
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-09-18 11:19:57

Indeks klastrowy jest zasadniczo posortowaną kopią danych w zindeksowanych kolumnach.

Główną zaletą klastrowego indeksu jest to, że gdy twoje zapytanie (wyszukiwanie) zlokalizuje dane w indeksie, nie jest potrzebne żadne dodatkowe IO do pobrania tych danych.

Koszty utrzymania indeksu klastrowego, zwłaszcza w często aktualizowanej tabeli, mogą prowadzić do słabej wydajności i z tego powodu lepiej jest utworzyć indeks bez klastra.

 5
Author: Ed Guiness,
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-09-18 11:22:08

Indeksowana baza danych składa się z dwóch części: zestawu fizycznych rekordów, które są ułożone w dowolnej kolejności, oraz zestawu indeksów, które określają kolejność odczytu rekordów, aby uzyskać wynik posortowany według jakiegoś kryterium. Jeśli nie ma korelacji między układem fizycznym a indeksem, odczyt wszystkich rekordów w kolejności może wymagać wykonania wielu niezależnych operacji odczytu pojedynczych rekordów. Ponieważ baza danych może być w stanie odczytać dziesiątki kolejnych rekordów w mniej czasu niż potrzeba, aby odczytać dwa nie-kolejne rekordy, wydajność może zostać poprawiona, jeśli rekordy, które są kolejne w indeksie są również przechowywane kolejno na dysku. Określenie, że indeks jest klastrowany, spowoduje, że baza danych będzie musiała podjąć pewne wysiłki (różne bazy danych różnią się co do tego, ile), aby uporządkować rzeczy tak, aby grupy rekordów, które są kolejno w indeksie, były kolejno na dysku.

Na przykład, jeśli ktoś miałby zacząć od pustej, nieklastrowanej bazy danych i dodać 10,000 rekordów w losowej kolejności, rekordy prawdopodobnie zostaną dodane na końcu w kolejności, w jakiej zostały dodane. Odczyt bazy danych w kolejności według indeksu wymagałby 10 000 odczytów jednego rekordu. Jeśli ktoś miał używać klastrowej bazy danych, jednak, system może sprawdzić podczas dodawania każdego rekordu, czy poprzedni rekord został zapisany przez siebie; jeśli okaże się, że tak jest, może napisać ten rekord z nowym na końcu bazy danych. Może wtedy spojrzeć na fizyczne Zapisz przed szczelinami, w których znajdowały się przeniesione rekordy i sprawdź, czy rekord, który następnie został zapisany sam. Gdyby tak się stało, mógłby przenieść ten zapis na to miejsce. Użycie tego rodzaju podejścia spowodowałoby, że wiele rekordów zostanie zgrupowanych w pary, co potencjalnie niemal podwoi prędkość odczytu sekwencyjnego.

W rzeczywistości, klastrowe bazy danych używają bardziej wyrafinowanych algorytmów niż to. Najważniejsze jest jednak, aby pamiętać, że istnieje kompromis między czas potrzebny na aktualizację bazy danych oraz czas potrzebny na jej sekwencyjne odczytywanie. Utrzymanie klastrowej bazy danych znacznie zwiększy ilość pracy wymaganej do dodawania, usuwania lub aktualizowania rekordów w jakikolwiek sposób, który miałby wpływ na sekwencję sortowania. Jeśli baza danych będzie czytana sekwencyjnie znacznie częściej niż będzie aktualizowana, klastrowanie może być dużą wygraną. Jeśli będzie on aktualizowany często, ale rzadko odczytywany w kolejności, klastrowanie może być dużym drenażem wydajności, zwłaszcza jeśli kolejność dodawania elementów do bazy danych jest niezależna od kolejności sortowania w odniesieniu do klastrowego indeksu.

 5
Author: supercat,
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-09-17 15:48:37