Co to jest indeks Kryty?

Właśnie usłyszałem termin covered index w jakiejś dyskusji bazy danych - co to znaczy?

Author: Martynnw, 2008-09-15

4 answers

A covering index jest indeksem, który zawiera wszystkie, a może nawet więcej kolumn potrzebnych do zapytania.

Na przykład to:

SELECT *
FROM tablename
WHERE criteria

Zazwyczaj używa indeksów, aby przyspieszyć rozdzielczość wierszy do pobrania za pomocą kryteriów , ale następnie przejdzie do pełnej tabeli, aby pobrać wiersze.

Jeśli jednak indeks zawierał Kolumny column1, column2 i column3 , to ten sql:

SELECT column1, column2
FROM tablename
WHERE criteria

I pod warunkiem, że konkretny indeks może być użyty do przyspieszenia rozdzielczości wierszy do pobrania, indeks zawiera już wartości kolumn, które Cię interesują, więc nie będzie musiał iść do tabeli, aby pobrać wiersze, ale może wygenerować wyniki bezpośrednio z indeksu.

Może być również użyty, jeśli zauważysz, że typowe zapytanie używa kolumn 1-2 do rozstrzygnięcia, które wiersze, a następnie zwykle dodaje kolejne kolumny 1-2, może być korzystne dołączenie tych dodatkowych kolumn (jeśli są one takie same over) do indeksu, tak aby procesor zapytań mógł uzyskać wszystko z samego indeksu.

Oto artykuł: pokrycie indeksu zwiększa wydajność zapytań SQL Server na ten temat.

 49
Author: Lasse Vågsæther Karlsen,
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-04-22 05:52:05

Indeks pokrycia jest zwykłym indeksem. Nazywa się to "pokryciem", jeśli może zaspokoić zapytanie bez konieczności analizowania danych.

Przykład:

CREATE TABLE MyTable
(
  ID INT IDENTITY PRIMARY KEY, 
  Foo INT
) 

CREATE NONCLUSTERED INDEX index1 ON MyTable(ID, Foo)

SELECT ID, Foo FROM MyTable -- All requested data are covered by index

Jest to jedna z najszybszych metod pobierania danych z serwera SQL.

 10
Author: aku,
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-15 10:52:54

Covering indexes są indeksami, które "pokrywają" wszystkie kolumny potrzebne z określonej tabeli, eliminując potrzebę dostępu do fizycznej tabeli w ogóle dla danego zapytania/ operacji.

Ponieważ indeks zawiera żądane kolumny (lub ich superset), dostęp do tabeli można zastąpić wyszukiwaniem indeksów lub skanowaniem-co jest na ogół znacznie szybsze.

Kolumny do pokrycia:

  • warunki parametryzowane lub statyczne; kolumny ograniczone parametryzowaną lub stałą warunek.
  • join columns; kolumny dynamicznie używane do łączenia
  • wybrane kolumny; aby odpowiedzieć na wybrane wartości.

Podczas gdy pokrycie indeksów może często zapewnić dobre korzyści dla wyszukiwania, dodają one nieco do wstawiania / aktualizacji narzutu; ze względu na konieczność pisania dodatkowych lub większych wierszy indeksu przy każdej aktualizacji.

Pokrycie indeksów dla połączonych zapytań

Indeksy pokrywające są prawdopodobnie najcenniejsze jako technika wykonania połączonych zapytań. To jest ponieważ połączone zapytania są bardziej kosztowne i bardziej prawdopodobne niż pobieranie z jednej tabeli, aby cierpieć problemy z wydajnością kosztową.

  • w połączonym zapytaniu, indeksy obejmujące powinny być brane pod uwagę w tabeli.
  • każdy "indeks pokrycia" usuwa fizyczny dostęp do tabeli z planu i zastępuje go dostępem tylko do indeksu.
  • zbadaj koszty planu i eksperymentuj, z którymi tabele są najbardziej opłacalne do zastąpienia przez indeks pokrycia.
  • w ten sposób mnożnik kosztów duże plany łączenia można znacznie zmniejszyć.

Na przykład:

select oi.title, c.name, c.address
from porderitem poi
join porder po on po.id = poi.fk_order
join customer c on c.id = po.fk_customer
where po.orderdate > ? and po.status = 'SHIPPING';

create index porder_custitem on porder (orderdate, id, status, fk_customer);

Zobacz:

 2
Author: Thomas W,
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-13 22:58:53

Powiedzmy, że masz prostą tabelę z poniższymi kolumnami, masz tylko indeks Id tutaj:

Id (Int), Telephone_Number (Int), Name (VARCHAR), Address (VARCHAR)

Wyobraź sobie, że musisz uruchomić poniższe zapytanie i sprawdzić, czy Używa indeksu i czy działa wydajnie bez wywołań I/O, czy nie. Pamiętaj, że stworzyłeś indeks tylko na Id.

SELECT Id FROM mytable WHERE Telephone_Number = '55442233';

Podczas sprawdzania wydajności w tym zapytaniu zostaniesz zawieszony, ponieważ {[3] } nie jest indeksowana, to musi pobierać wiersze z tabeli za pomocą wywołań We / Wy. Więc to nie jest przykrywka. indeksowane, ponieważ w zapytaniu znajduje się jakaś kolumna, która nie jest indeksowana, co prowadzi do częstych wywołań We/Wy.

Aby zrobić z niego indeks pokryty, musisz utworzyć indeks złożony na (Id, Telephone_Number).

Aby uzyskać więcej informacji, zapoznaj się z tym blogiem: https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/

 2
Author: JumpMan,
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-11-08 19:18:15