Кілька індексів проти індексних стовпців


645

Я щойно додавав індекс до таблиці в SQL Server 2005, і це задумало мене. Яка різниця між створенням 1 індексу та визначенням декількох стовпців над тим, щоб мати 1 індекс на стовпець, який потрібно індексувати.

Чи є певні причини, чому одну слід використовувати над іншою?

Наприклад

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

Проти

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)

Відповіді:


319

Я згоден з Кейдом Ру .

Ця стаття має стати на правильному шляху:

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

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

наприклад, уявіть, що ви шукаєте таблицю в трьох стовпцях

штат, повіт, поштовий індекс.

  • Ви іноді здійснюєте пошук лише за державою.
  • Ви іноді здійснюєте пошук за штатом та округом.
  • Ви часто шукаєте по державі, округу та поштовому індексу.

Потім індекс із державою, округом, поштовим індексом. буде використовуватися в усіх трьох цих пошуках.

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

Потім ви можете створити індекс лише на Zip, який буде використовуватися в цьому випадку.

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

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

Стаття дуже допоможе. :-)


2
Тож найкраще було б визначити індекс для штату, округу та zip на додаток до індивідуального індексу для кожного стовпця?
Максим Заславський

12
@jball Я тут щось пропускаю? Схоже, у статті йдеться про відмінності між обмеженнями версій SQL Server. Чи можна було перемістити статтю?
Ян Р. О’Браєн

@Ian це схоже на те, що щось втрачено в найближчі 3 роки, так як я розібрав оригінальне посилання відтепер більше 4 років тому. Я можу вам сказати, що повідомлення в блозі має правильну назву, як це було пов’язано з зломхомером, але схоже, що наступні блоги в цій серії вже не легко можна знайти з цього першого допису. Вам доведеться розібратися в архіві блогу Кімберлі, щоб побачити, чи зможете ви з’ясувати інших у цій серії.
jball

1
1) "В основному [Кластерний індекс із стовпцем Ідентичність як перший] допомагає вашим даним вставляти в кінці індексу" правильно. "і не спричиняє багато розбитків вводу-виводу диска та сторінки" є абсолютно помилковим у системі для багатьох користувачів. Правда полягає в тому, що це гарантує високу суперечливість (низьку сумісність) у багатокористувацькій системі. 2) Кластерний індекс повинен бути реляційним ключем, тобто. не є IDENTITY, GUID, etc. 3) "Тоді індекс із штатом, округом, поштовим індексом буде використаний у всіх трьох цих пошуках." є помилковим і суперечить "перший стовпець є корисним". Колонки 2-го та підрозділу в індексі не використовуються для пошуку.
PerformanceDBA

82

Так. Рекомендую переглянути статті Кімберлі Трипп про індексацію .

Якщо індекс "охоплює", тоді не потрібно використовувати нічого, крім індексу. У SQL Server 2005 ви також можете додати додаткові стовпці до індексу, які не є частиною ключа, що може усунути поїздки до решти рядка.

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

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


7
Кімберлі Тріпп знає, про що вона говорить. Я був на розмові з нею, і вона знає це зсередини. Чудова порада.
злийхомер

@CadeRoux Якщо в більшості випадків мій, де в пункті є 2 стовпчики у співвідношенні '&', буде краще мати індекс у декількох стовпцях або індекс одного стовпця на обох
це пастка

2
@RachitGupta Один індекс з обома колонками
Cade Roux

41

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

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

Це можна знайти безпосередньо за допомогою індексу багато стовпців. З іншого боку, може бути використаний максимум один індекс одного стовпця (він повинен шукати всі записи, що мають стовпець1 = 1, а потім перевіряти стовпці2 та стовпці3 у кожному з них).


24
Це вірно. Однак, якщо ці стовпці є єдиним індексом, кожен все одно значно прискорить роботу. Зазвичай одне із значень у стовпцях настільки зменшить отриманий набір, що не має значення шукати решту без індексу, і оптимізатор добре підбирає це значення.
TToni

17

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


+1 за пов’язане добре пояснення того, як використовуються (звичайні) індекси, що стосуються питання.
RobM

8

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

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

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

Слід запитати себе, чому ви індексуєте стовпці та як вони будуть використовуватися. Запустіть кілька планів запитів і подивіться, коли до них звертаються. Налаштування індексу - це стільки ж інстинкту, скільки і наука.

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