Jak używać indeksu w instrukcji select?

Powiedzmy, że w tabeli pracowników utworzyłem indeks (idx_name) w kolumnie emp_name tabeli.

Czy muszę jawnie podać nazwę indeksu w klauzuli select, czy też zostanie ona automatycznie użyta do przyspieszenia zapytań.

Jeśli wymagane jest podanie w klauzuli select, Jaka jest składnia użycia indeksu w zapytaniu select ?

Author: Vivek, 2011-07-06

8 answers

Jeśli chcesz przetestować indeks, aby sprawdzić, czy działa, oto składnia:

SELECT *
FROM Table WITH(INDEX(Index_Name))

Instrukcja WITH wymusi użycie indeksu.

 62
Author: Jason,
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-11-02 15:20:47

Dobre pytanie,

Zwykle silnik DB powinien automatycznie wybrać indeks do użycia w oparciu o plany wykonywania zapytań, które buduje. Istnieją jednak dość rzadkie przypadki, gdy chcemy wymusić użycie określonego indeksu przez DB.

Aby móc odpowiedzieć na konkretne pytanie, musisz określić DB, którego używasz.

Dla MySQL, chcesz przeczytać składnia podpowiedzi indeksu dokumentacja jak to zrobić

 29
Author: Tudor Constantin,
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-06 08:52:29

Jak używać indeksu w instrukcji select?
tędy.:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

I wiele innych sposobów sprawdź to

Czy muszę wyraźnie określić?

  • Nie, Nie trzeba wyraźnie określać.
  • DB engine powinien automatycznie wybrać indeks do użycia na podstawie planów wykonywania zapytań, które buduje z @Tudor Constantin answer.
  • optymalizator oceni, czy użycie twojego indeksu sprawi, że Twoje zapytanie będzie działać szybciej, a jeśli tak, użyje indeksu. from @niktrl odpowiedz
 21
Author: VedX,
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
2015-03-18 08:11:51

W ogólne , indeks zostanie użyty, jeśli zakładany koszt korzystania z indeksu, a następnie ewentualnie konieczność przeprowadzenia dalszych poszukiwań zakładek jest niższy niż koszt samego skanowania całej tabeli.

Jeśli Twoje zapytanie dotyczy formularza:

SELECT Name from Table where Name = 'Boris'

I 1 rząd na 1000 ma imię Borys, to prawie na pewno będzie używany. Jeśli każdy ma na imię Boris, prawdopodobnie ucieknie się do skanowania tabeli, ponieważ indeks raczej nie będzie skuteczniejszą strategią dostępu do data.

Jeśli jest to szeroka tabela (wiele kolumn) i robisz:

SELECT * from Table where Name = 'Boris'

Wtedy może nadal wybrać skanowanie tabeli, jeśli jest to rozsądne założenie, że odzyskanie innych kolumn z tabeli zajmie więcej czasu, niż tylko wyszukanie nazwy, lub ponownie, jeśli prawdopodobnie i tak będzie pobierać wiele wierszy.

 12
Author: Damien_The_Unbeliever,
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-06 08:53:25

Optymalizator oceni, czy użycie twojego indeksu sprawi, że Twoje zapytanie będzie działać szybciej, a jeśli tak, użyje indeksu.

W zależności od RDBMS możesz wymusić użycie indeksu, chociaż nie jest to zalecane, chyba że wiesz, co robisz.

Ogólnie powinieneś indeksować kolumny, których używasz w poleceniach table join i where

 9
Author: niktrs,
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-06 08:52:37

Ogólnie rzecz biorąc, gdy tworzysz indeks w tabeli, baza danych automatycznie użyje tego indeksu podczas wyszukiwania danych w tej tabeli. Nie musisz nic z tym robić.

Jednakże, w MSSQL, można określić index hint, który może określić, że dany indeks powinien być użyty do wykonania tego zapytania. Więcej informacji na ten temat można znaleźć tutaj .

Index hint wydaje się być również dostępny dla MySQL . Dzięki Tudorowi Constantine ' owi.

 5
Author: MD Sayem Ahmed,
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-06 08:53:41

Używając kolumny, do której indeks zostanie zastosowany w Twoich warunkach, zostanie on dołączony automatycznie. Nie musisz go używać, ale przyspieszy to zapytania, gdy jest używany.

SELECT * FROM TABLE WHERE attribute = 'value'

Użyje odpowiedniego indeksu.

 3
Author: ChrisBint,
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-06 08:51:07

Podpowiedź indeksu jest dostępna tylko dla serwerów baz danych Microsoft Dynamics. W przypadku tradycyjnego serwera SQL filtry zdefiniowane w klauzuli "gdzie" powinny przekonać silnik do użycia odpowiednich indeksów... Pod warunkiem, że plan wykonania silnika może skutecznie zidentyfikować sposób odczytu informacji ( czy to skanowanie pełnej tabeli, czy skanowanie indeksowane)-musi porównać te dwa przed wykonaniem właściwej instrukcji, jako część wbudowanego optymalizatora wydajności.

Jednak można wymusić optymalizator do skanowania za pomocą czegoś takiego jak

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

Lub szukać konkretnego indeksu używając czegoś takiego jak

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...
Wybór należy do ciebie. Spójrz na właściwości indeksu tabeli w panelu obiekt, aby dowiedzieć się, którego indeksu chcesz użyć. Powinien pasować do Twoich filtrów.

Aby uzyskać najlepsze wyniki, wymień filtry, które najpierw zwrócą najmniejszą liczbę wyników. Nie wiem, czy mam rację mówiąc, ale wydaje się, że filtry zapytań są sekwencyjne; jeśli masz swój Sekwencja prawo, optymalizator nie powinien zrobić to za Ciebie porównując wszystkie kombinacje, lub przynajmniej nie rozpocząć porównanie z droższych zapytań.

 0
Author: Cory,
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-31 14:11:25