У чому полягає різниця між планом сканування індексу та пошуком індексу в плані виконання SQL Server
Я працюю на SQL Server 2005.
Відповіді:
Сканування індексу - це місце, де SQL-сервер зчитує весь індекс, шукаючи збіги - час, який потрібно, пропорційний розміру індексу.
Пошук індексу - це те місце, де сервер SQL використовує структуру дерева b-індексу для безпосереднього пошуку відповідних записів (див. Http://mattfleming.com/node/192, щоб дізнатись, як це працює) - час, який потрібно, лише пропорційний кількість відповідних записів.
Основне правило, якого слід дотримуватися - Сканування - це погано, Шукання - це добре.
Сканування індексу
Коли SQL Server виконує сканування, він завантажує об'єкт, який він хоче прочитати з диска, в пам'ять, а потім читає цей об'єкт зверху вниз, шукаючи потрібні йому записи.
Пошук індексу
Коли SQL Server виконує пошук, він знає, де в індексі будуть дані, тому він завантажує індекс з диска, переходить безпосередньо до тієї частини індексу, яка йому потрібна, і зчитує туди, де закінчуються потрібні йому дані . Очевидно, це набагато ефективніша операція, ніж сканування, оскільки SQL вже знає, де знаходяться дані, які він шукає.
Як я можу змінити план виконання, щоб використовувати Seek замість Scan?
Коли SQL Server шукає ваші дані, можливо одна з найбільших речей, яка змусить SQL Server перейти від пошуку до сканування, - це те, коли деякі шукані вами стовпці не включені до індексу, який ви хочете використовувати. Найчастіше SQL Server повертається до сканування кластерного індексу, оскільки кластерний індекс містить усі стовпці таблиці. Це одна з найбільших причин (принаймні на мій погляд), що ми тепер маємо можливість ВКЛЮЧИТИ стовпці в індекс, не додаючи ці стовпці до індексованих стовпців індексу. Включаючи додаткові стовпці в індекс, ми збільшуємо розмір індексу, але ми дозволяємо SQL Server читати індекс без необхідності повертатися до кластерного індексу або до самої таблиці, щоб отримати ці значення.
Список літератури
Інформацію про особливості кожного з цих операторів у плані виконання SQL Server див.
Коротка відповідь:
Сканування індексу: торкніться всіх рядків, крім певних стовпців.
Пошук покажчика: торкніться певних рядків та певних стовпців.
За допомогою сканування індексу всі рядки в індексі скануються, щоб знайти відповідний рядок. Це може бути ефективно для невеликих столиків. За допомогою програми Index Seek йому потрібно лише торкнутися рядків, які насправді відповідають критеріям, і, як правило, це більш ефективно
Сканування індексу відбувається, коли визначення індексу не може знайти в одному рядку, щоб задовольнити предикати пошуку. У цьому випадку SQL Server повинен просканувати кілька сторінок, щоб знайти діапазон рядків, які задовольняють пошукові предикати.
У випадку пошуку індексу, SQL Server знаходить один рядок, що відповідає предикатам пошуку, використовуючи визначення індексу .
Індекс шукає кращі та ефективніші.
Сканування торкається кожного рядка таблиці, навіть якщо це те, що ви шукаєте чи ні
Пошук шукає лише ті рядки, які є тим, що ви шукаєте.
Шукати завжди краще, ніж сканувати, оскільки вони ефективніші в тому, як вони шукають дані.
Хороше пояснення можна знайти тут