Чому бази даних не створюють власні індекси автоматично?


32

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


3
Ваш автомобіль автоматично фіксує власну плоску шину?
Керміт

11
Більш точна аналогія - чи змінює ваш ECU потужність, що подається на паливний насос, щоб встановити витрату палива / масла та компенсувати брудні лінії? на що відповідь - так ..
Jharwood

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

1
Вони - для стовпців, які мають UNIQUEобмеження.
dan04

8
Якщо ви перейдете на "самонастроювання баз даних" від Google, ви знайдете багато досліджень з цього приводу. Можливо, в майбутньому буде звичайно мати якийсь елемент цього.
Мартін Сміт

Відповіді:


25

Оновлення

Це зараз реалізовано в SQL Server Azure. Це формує рекомендації

введіть тут опис зображення

та управління індексами може бути налаштовано як автоматичне .

Увімкнути автоматичне управління індексом

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

Оригінальний відповідь

У деяких базах даних вже (вид) індекси створюються автоматично.

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

Можливо, в майбутньому RDBMS матимуть здатність динамічно падати та створювати стійкі індекси відповідно до завантаженості.

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

Відсутній показник DMV, згаданий Кеннетом, не планується реалізовувати наосліп, оскільки вони враховують лише переваги конкретного запиту та не намагаються врахувати вартість потенційного індексу для інших запитів. Він також не консолідує аналогічні відсутні індекси. наприклад, вихід цього DMV може повідомити про відсутніх індексах на A,B,CіA,B INCLUDE(C)

Деякі актуальні проблеми з ідеєю є

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

Мабуть, розумно очікувати, що точність моделей витрат з часом поліпшиться, але точка 2 виглядає складніше для вирішення, а точка 3 по суті нерозв'язна.

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

Проект AutoAdmin в Microsoft Research працює з 1996 року

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

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

Ще одна цікава проблема виникає, коли немає доступних баз даних (наприклад, вбудована база даних або малий бізнес). У таких сценаріях може стати важливим підхід безперервної настройки індексу з низьким дотиком. Ми дослідили рішення ... [in] " Інтернет-підхід до настройки фізичного дизайну " в ICDE 2007.

Автори констатують

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

У статті представлений алгоритм

Основними його характеристиками є:

  • По мірі оптимізації запитів ми визначаємо відповідний набір кандидатських індексів, які б підвищили ефективність. Ця функція дозволяє обробці запитів тривати паралельно з індексами, які будуються у фоновому режимі.
  • Під час виконання ми відстежуємо потенційні вигоди, які ми втрачаємо, не маючи таких кандидатських індексів, а також корисність існуючих індексів за наявності запитів, оновлень та обмежень місця.
  • Після того, як ми наберемо достатньо «доказів», що фізична зміна дизайну є корисною, ми автоматично запускаємо створення індексів чи їх видалення.
  • Принцип нашої проблеми в Інтернеті означає, що ми загалом будемо відставати від оптимальних рішень, які знають майбутнє. Однак, ретельно вимірюючи докази, ми гарантуємо, що ми не зазнаємо серйозних "пізніх" рішень, тим самим обмежуючи суму понесених збитків

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

Висновок авторів на тему " Інтернет проти традиційної фізичної настройки".

Онлайн-алгоритми в цій роботі корисні, коли DBA не впевнені в майбутньому поведінці робочого навантаження або не мають можливості робити всебічний аналіз чи моделювання. Якщо DBA має повну інформацію про характеристики робочого навантаження, то статичний аналіз та розгортання за допомогою існуючих інструментів (наприклад, [2, 3]) буде кращою альтернативою.

Висновки тут схожі з висновками в іншому документі " Налаштування індексів, керований автономними запитами"

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


4
Для кар’єри DBA надзвичайно небезпечно вважати, що його вміння ніколи не можна автоматизувати. Це вбиває кар'єру хлопців у мережі зараз, оскільки перехід до визначених програмним центром даних. Як хороші DBA ми повинні вести зусилля з автоматизації.
Гай

20

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

Якщо б не було покарання мати індекси, то було б підходом рушниці просто додати нескінченну кількість індексів. Але оскільки модифікація даних (INSERTS, UPDATES і DELETES) впливає на включені індекси в таблиці, то ця змінна накладні витрати цих індексів.

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


Коментарі не для розширеного обговорення; ця розмова перенесена в чат .
Пол Білий каже, що GoFundMonica

13

Насправді є деякі бази даних, які роблять це. Наприклад, BigTable від Google та SimpleDB Amazon автоматично створюють індекси (хоча це не RDBMS) . Також є щонайменше один двигун MySQL RDBMS, який робить це. SQL Server також відслідковує індекси, які, на його думку, слід створити , хоча це не так далеко, як власне їх створення.

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

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


4
Я б сказав, що порівнюючи BigTable (та його похідні, такі як Cassandra, HBase тощо) з рішеннями RDBMS, це порівняння яблук з апельсинами - BigTable та похідні більше схожі на гігантські ключові значення або стовпчасті сховища, а рядовий ключ по суті є індексом .
Суман

1
Саме так. Питання позначене тегом, rdbmsі я не думаю, що BigTable потрапляє в категорію.
ypercubeᵀᴹ

2
@ypercube: ... Так, я це згадував у своїй відповіді; але про це все-таки варто знати, принаймні, як точку інтересу. Я також декілька згаданих інших баз даних, які є це RDBMS, і пояснив, чому це не часто. Це, безумовно, не заслуговує на перемогу ...
BlueRaja - Danny Pflughoeft

1
Я не спровокував. Я згоден, це дуже складна проблема.
ypercubeᵀᴹ

10

Хоча вже є кілька обширних відповідей, вони, здається, спідничають навколо реальної відповіді: Індекси не завжди бажані.

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

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

Справа в тому, що індекси не створюються автоматично, оскільки вони не є відповіддю на все. Проектування індексів - це не просто випадок сказати: "Ей, це пришвидшить мої читання", є й інші фактори, які слід врахувати.


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

> Можливо, фіксація є критичною для часу, і читання не є; за обставин може бути неприйнятним сповільнювати вкладку. Така гарна відповідь, дуже корисна.
Сіддхартха

6

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


-4

Вони не розумні, вони є частиною коду. Кожного разу, коли ви вводите нові дані в базу даних, їй потрібно знайти нове місце розташування до неї та карту, щоб знайти їх, коли вони вимагаються. Індексація звучить простіше, ніж є, ви просто даєте нове число новому фрагменту даних? Ну а як бути, якщо наступний запит не про останній фрагмент даних, а про 36271 фрагменти раніше? Ви можете легко знайти його за допомогою свого індексу, правда? Але що робити, якщо запит включає таке слово, як "риболовля", яке можна знайти в старому 36271 шматку, виготовленому в 1997 році? Хо? Ні слова про риболовлю в старій статті.

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

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