Як використовувати індекс у операторі select?


97

Скажімо, у таблиці співробітників я створив індекс (idx_name) у emp_nameстовпці таблиці.

Чи потрібно явно вказувати ім'я індексу в пропозиції select, або воно буде автоматично використано для прискорення запитів.

Якщо це потрібно вказати у реченні select, який синтаксис для використання індексу у запиті select?

Відповіді:


86

Якщо ви хочете протестувати індекс, щоб побачити, чи він працює, ось синтаксис:

SELECT *
FROM Table WITH(INDEX(Index_Name))

Оператор WITH змусить індекс використовуватись.


82
Цей допис не відповідає на запитання. Відповідь коротка: вам не потрібно вказувати індекс у запиті. Він використовується (або не використовується) автоматично. Однак ви можете змусити його. Детальніше (коли і навіщо це робити) в інших публікаціях нижче.
Раст

34

Гарне питання,

Зазвичай механізм БД повинен автоматично вибирати індекс для використання на основі побудованих ним планів виконання запитів. Однак є деякі досить рідкісні випадки, коли ви хочете змусити БД використовувати певний індекс.

Щоб мати можливість відповісти на ваше конкретне запитання, вам слід вказати БД, яку ви використовуєте.

Для MySQL ви хочете прочитати документацію щодо синтаксису підказки щодо того, як це зробити


30

Як використовувати індекс у операторі select?
сюди:

   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);

І ще багато способів перевірити це

Чи потрібно явно вказувати?

  • Ні, немає Потрібно чітко вказувати.
  • Механізм БД повинен автоматично вибрати індекс для використання на основі планів виконання запитів, які він будує з відповіді @Tudor Constantin.
  • Оптимізатор вирішить, чи використання вашого індексу пришвидшить роботу вашого запиту, а якщо так, то він буде використовувати індекс. з @niktrl відповідь

13

В загальному , індекс буде використовуватися , якщо передбачувана вартість використання індексу, а потім , можливо , того , щоб виконати додаткові закладки Lookups нижче , ніж вартість просто сканувати всю таблицю.

Якщо ваш запит має форму:

SELECT Name from Table where Name = 'Boris'

І 1 рядок з 1000 має ім’я Борис, це майже напевно буде використано. Якщо всіх звати Борис, можливо, вдасться до сканування таблиці, оскільки індекс навряд чи буде більш ефективною стратегією доступу до даних.

Якщо це широка таблиця (багато стовпців), і ви робите:

SELECT * from Table where Name = 'Boris'

Тоді він все одно може вибрати сканування таблиці, якщо є обґрунтоване припущення, що для отримання інших стовпців із таблиці знадобиться більше часу, ніж для простого пошуку імені, або ще раз, якщо існує ймовірність отримання багато рядків у будь-якому випадку.


9

Оптимізатор вирішить, чи використання вашого індексу пришвидшить роботу вашого запиту, а якщо так, то він буде використовувати індекс.

Залежно від вашої СУБД, ви можете змусити використовувати індекс, хоча це не рекомендується, якщо ви не знаєте, що робите.

Загалом ви повинні індексувати стовпці, які ви використовуєте в операторах join і where


5

Використовуючи стовпець, до якого застосовується індекс у ваших умовах, він буде включений автоматично. Вам не потрібно його використовувати, але це прискорить запити, коли він буде використаний.

SELECT * FROM TABLE WHERE attribute = 'value'

Буде використовувати відповідний індекс.


5

Як правило, коли ви створюєте індекс у таблиці, база даних автоматично використовуватиме цей індекс під час пошуку даних у цій таблиці. З цим нічого робити не потрібно.

Однак у MSSQL ви можете вказати, index hintякий може вказати, що певний індекс повинен використовуватися для виконання цього запиту. Більше інформації про це можна знайти тут .

Index hintтакож, здається, доступний для MySQL . Завдяки Тудору Костянтину.


1

Підказка щодо індексу доступна лише для серверів баз даних Microsoft Dynamics. Для традиційного SQL Server фільтри, які ви визначаєте у своєму пункті "Де", повинні переконувати механізм використовувати будь-які відповідні індекси ... За умови, що план виконання двигуна може ефективно визначити, як читати інформацію (будь то повне сканування таблиці чи індексоване сканування) ) - він повинен порівняти ці два перед виконанням власне оператора, як частину вбудованого оптимізатора продуктивності.

Однак ви можете змусити оптимізатор сканувати, використовуючи щось на зразок

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

Або шукати певний індекс, використовуючи щось на зразок

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

Вибір за вами. Подивіться на властивості індексу таблиці на панелі об’єктів, щоб отримати уявлення про те, який індекс ви хочете використовувати. Він повинен відповідати вашим фільтрам.

Для найкращих результатів перелічіть фільтри, які спочатку повернуть найменшу кількість результатів. Я не знаю, чи правильно я кажу, але здається, що фільтри запитів є послідовними; якщо ви правильно зробили послідовність, оптимізатору не потрібно робити це за вас, порівнюючи всі комбінації, або, принаймні, не починати порівняння з більш дорогими запитами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.