Як дізнатися, які індекси створити для таблиці?


33

Чи є спосіб я визначити найкращий спосіб дізнатися, які індекси створити для таблиці?


11
Є. Спробуйте, наприклад, use-the-index-luke.com .
dezso

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

Будь ласка, не робіть цього. Первинний ключ визначає, як фізично сортуються дані в таблиці, і це має власні міркування. Ви повинні вибирати первинний ключ дуже обережно, оскільки він також використовується у всіх інших ваших індексах. Зверніться до: sqlskills.com/blogs/kimberly/…
Алі Разегі

4
@AliRazeghi Це (фізичне сортування) вірно в деяких СУБД (за певних обставин), а не в інших. Наприклад, не вірно в PostgreSQL.
dezso

Голосування резервного копіювання!
Алі Разегі

Відповіді:


29

Короткі правила великого пальця. (Деякі з них створюються автоматично, але, можливо, пізніше їх можна буде скинути вручну, залежно від dbms. Не припускайте, що ви завжди будете працювати на PostgreSQL.)

  • Індексуйте кожен первинний ключ.
  • Індексуйте кожен іноземний ключ.
  • Індексуйте кожен стовпець, використаний у пункті JOIN.
  • Індексуйте кожен стовпець, використаний у пункті WHERE.
  • Вивчіть свою документацію, щоб дізнатися "езотеричні" параметри індексації, які підтримує dbms.

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

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

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

Немає заміни для вивчення документів для вашого конкретного dbms.

  • СТВОРИТИ ІНДЕКС
  • Індекси (зверніть увагу особливо на розділи про вираження індексування, про часткові індекси та про використання індексу)

14

Окрім того, що вже надано @Catcall , і додати невеликий коректив:

Нещодавно я також висвітлював деякі основи у цій тісно пов язаній відповіді .

На сьогодні відповіді вказують, що вам потрібно створити індекси на первинних ключах, але це не так у PostgreSQL (застосовуються часткові винятки). Цитую посібник тут :

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

Сміливий акцент мій.

Ви можете створити додаткові індекси для другого чи пізніших стовпців індексу багато стовпців, але перший, як правило, покритий просто колонковим індексом, за винятком випадків, коли додаткові стовпці роблять індекс набагато більшим. Ми це детально обговорили під цим пов'язаним питанням:

Чи складний індекс також хороший для запитів у першому полі?

Багатоколінні індекси , часткові індекси та індекси виразів є особливо потужним інструментом у PostgreSQL. Оскільки PostgreSQL 9.2 також існує сканування лише для індексів , еквівалент "покриває індекси" в інших RDBMS. Це не інший тип індексу, а нова здатність RDBMS з існуючими типами індексу.

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

Як правило, операції запису ( DELETE, UPDATE) дорожчають (але можуть також принести користь!), А операції читання ( SELECT), як правило, лише приносять користь. Занадто багато індексів можуть вичерпати кеш - пам'ять , так що навіть операції читання можуть страждати.

Нарешті, ця сторінка Wiki Postgres щодо технічного обслуговування індексів містить інструменти для пошуку повторюваних чи невикористаних індексів (серед іншого).


Якщо я добре пам’ятаю, автоматичний індекс за PK також створюється на Oracle v.> = 10 та Sql Server> = 2008
EAmez

1

Є два варіанти.

  1. Ви робите це.
  2. Технологія це робить.

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

Пгеро

Pghero може допомогти вам, якщо ви хочете отримати автоматичну пораду.

Однак це має деякі недоліки.

  1. Це працює тільки на WHEREі ORDER BY, ні JOINS.
  2. Він використовує лише статистику про відсоток NULL та різні значення.

Перегляньте це відео для отримання додаткової інформації .

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