Чи погано мати індексний простір більше, ніж простір даних?


22

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

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

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

Я вибираю лише потрібні стовпці. Проблема в тому, що я фільтрую за датою, тому двигун обов’язково зробить сканування таблиці, щоб відповідати стовпцям. Запит проводиться раз на день, вночі, щоб зібрати статистику, але для запуску потрібно 15 хвилин (у нас є ще одне жорстке і швидке правило: жодна процедура не повинна тривати 3 хвилини).

DBA показав мені статистику індексу. На цій таблиці було близько 10 індексів, з яких було використано лише 6 (статистика показала нульове звернення до 4 з них). Це велика система з участю понад 20 розробників. Індекси були створені з будь-якої причини і, ймовірно, більше не використовуються.

Нам потрібно підтримувати SQL Server 2008, оскільки саме так працюють тестувальні БД. Але клієнтами все є у 2014 та 2016 роках.

Відповіді:


34

Подумайте про дизайн покажчика як розсувний перемикач. Ви можете перемістити цю червону ручку перемикача трикутника будь-де вздовж потрібної лінії:

Покажчики дизайнерських рішень

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

Це здається, що ваша DBA вважає, що перемикач занадто далеко вправо - ви додали занадто багато індексів, а видалення / оновлення / вставки виконуються занадто повільно.

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

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

Можливо, вам доведеться мати менше МІНШИХ індексів, ніж 5, коли ваше навантаження сильно налаштоване на операції видалення / оновлення / вставки, і у вас не вистачає апаратних кінських сил, щоб підтримувати.

Можливо, ви зможете мати багато БІЛЬШЕ індексів, коли ваше навантаження в основному є лише для читання або коли ви інвестуєте значні кошти в апаратне забезпечення (наприклад, кешуйте всю базу даних в пам'яті та маючи під собою все твердотільне зберігання.)


4

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

Це, ймовірно, вказує на те, що ви могли б отримати користь від кластерного або некластеризованого індексу зберігання стовпців на столі.

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

Індекси стовпців магазину розроблені для роботи в важких робочих навантаженнях OLTP з SQL Server 2016+. Дивіться документацію щодо оперативної аналітики в реальному часі .


3

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

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

Якщо структуру запиту та / або даних неможливо змінити для досягнення мети, я думаю, вона зводиться до трьох варіантів.

  1. Повільне пошуку даних
  2. Повільне оновлення даних
  3. Більше апаратних ресурсів $$$$

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


0

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

Однак слід враховувати багато речей:

  • Багато індексів робить вставки / оновлення / видалення повільнішими. Тож якщо ваша таблиця сильно зміниться, будьте обережні, щоб не зробити їх занадто багато.
  • Простір теж може бути проблемою. Не тільки тому, що гігабайти коштують грошей (не багато зараз), а й час, оскільки резервне копіювання буде повільнішим (залежно від того, як робиться резервне копіювання).
  • Більшість серйозних баз даних можна відстежувати, щоб знайти індекси, які рідко або ніколи не використовуються. Подумайте про те, щоб скинути деякі з них.
  • Іноді ви думаєте, що вам потрібен індекс, але при більш детальному вивченні запиту він може бути налаштований і переписаний по-різному з тим же результатом і без потреби в індексі. Використовуйте план пояснення, щоб побачити, чи використовується індекс чи ні.
  • Іноді останній стовпець (і) можна викинути з індексу з декількома стовпцями без особливих результатів. І іноді це може навіть зробити запити швидшими, оскільки місце для зберігання індексу менше і більше індексу буде зберігатися / зберігатися в пам'яті в будь-який момент часу.
  • Індекси на основі функцій можуть замінити звичайні, щоб заощадити більше місця. Приклад: замість запиту про повне прізвище, запит на перші дві літери також ( where substr(surname, 1, 2) = substr(<userinput>, 1, 2) and surname=<userinput>) та create index i on customers(substr(surname,1,2)). Це може бути досить швидким, а ваш індекс буде меншим.
  • Бази даних підтримують різні типи індексів. Деякі типи використовують менше місця, ніж інші. Може бути, деякі ваші індекси можуть бути перетворені на менш затратний простір? Обов’язково спочатку зрозумійте різні типи індексу та ситуації, в яких вони хороші та погані.
  • Якщо нечаста пакетна робота - це єдине, що потребує конкретного індексу, розгляньте можливість створення цього індексу лише для цієї пакетної роботи та опустіть його згодом.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.