Плани SQL Server: різниця між Index Scan / Index Seek


87

У чому полягає різниця між планом сканування індексу та пошуком індексу в плані виконання SQL Server

Я працюю на SQL Server 2005.

Відповіді:


128

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

Пошук індексу - це те місце, де сервер SQL використовує структуру дерева b-індексу для безпосереднього пошуку відповідних записів (див. Http://mattfleming.com/node/192, щоб дізнатись, як це працює) - час, який потрібно, лише пропорційний кількість відповідних записів.

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

3
Посилання все ще активне? для мене це не працює. Будь ласка, допоможіть, якщо є оновлене посилання
Ronak Agrawal

2
@RonakAgrawal Схоже, що посилання насправді мертве - можливо, замість цього перевірте wikipedia ?
Джастін


76

Основне правило, якого слід дотримуватися - Сканування - це погано, Шукання - це добре.

Сканування індексу

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

Пошук індексу

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


Як я можу змінити план виконання, щоб використовувати Seek замість Scan?

Коли SQL Server шукає ваші дані, можливо одна з найбільших речей, яка змусить SQL Server перейти від пошуку до сканування, - це те, коли деякі шукані вами стовпці не включені до індексу, який ви хочете використовувати. Найчастіше SQL Server повертається до сканування кластерного індексу, оскільки кластерний індекс містить усі стовпці таблиці. Це одна з найбільших причин (принаймні на мій погляд), що ми тепер маємо можливість ВКЛЮЧИТИ стовпці в індекс, не додаючи ці стовпці до індексованих стовпців індексу. Включаючи додаткові стовпці в індекс, ми збільшуємо розмір індексу, але ми дозволяємо SQL Server читати індекс без необхідності повертатися до кластерного індексу або до самої таблиці, щоб отримати ці значення.

Список літератури

Інформацію про особливості кожного з цих операторів у плані виконання SQL Server див.


7

Коротка відповідь:

  • Сканування індексу: торкніться всіх рядків, крім певних стовпців.

  • Пошук покажчика: торкніться певних рядків та певних стовпців.


4

За допомогою сканування індексу всі рядки в індексі скануються, щоб знайти відповідний рядок. Це може бути ефективно для невеликих столиків. За допомогою програми Index Seek йому потрібно лише торкнутися рядків, які насправді відповідають критеріям, і, як правило, це більш ефективно


2

Сканування індексу відбувається, коли визначення індексу не може знайти в одному рядку, щоб задовольнити предикати пошуку. У цьому випадку SQL Server повинен просканувати кілька сторінок, щоб знайти діапазон рядків, які задовольняють пошукові предикати.

У випадку пошуку індексу, SQL Server знаходить один рядок, що відповідає предикатам пошуку, використовуючи визначення індексу .

Індекс шукає кращі та ефективніші.


0

Сканування торкається кожного рядка таблиці, навіть якщо це те, що ви шукаєте чи ні

Пошук шукає лише ті рядки, які є тим, що ви шукаєте.

Шукати завжди краще, ніж сканувати, оскільки вони ефективніші в тому, як вони шукають дані.

Хороше пояснення можна знайти тут


3
Пошук не завжди кращий, наприклад, якщо таблиця порівняно невелика і потрібно повернути великий відсоток рядків у цій таблиці, то сканування індексу може виявитися набагато ефективнішим.
Джастін

1
Привіт, Джастін, я думаю, ти хочеш сказати, що сканування таблиці може бути кращим. Пошук індексів завжди кращий за сканування індексу, якщо ми не говоримо про кластеризацію. Але іноді сканування таблиці або кластерне сканування індексу може бути ефективнішим із зазначеної вами причини. Замість того, щоб шукати індекс і отримувати поля, які не є в індексі з таблиці, іноді ms sql використовуватиме таблицю, навіть якщо індекс має поле критеріїв.
Хосе Ареас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.