Що таке "Індекс часткового узгодження"?


27

Я намагаюся дізнатися більше про оператор плану запитів "перевірка посилань на іноземні ключі", запроваджений у SQL Server 2016. Там не так багато інформації про нього. Корпорація Майкрософт оголосила про це тут, і я тут про це блогувала . Нового оператора можна побачити, видаливши рядок із батьківської таблиці з 254 або більше вхідними посиланнями іноземних ключів: dbfiddle посилання .

У реквізитах оператора відображаються три різних рахунки:

FK перевірити деталі

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

Що таке частковий показник відповідності в цьому контексті? Мені не вдалося змусити нічого з наступного:

  • Фільтровані індекси
  • Розміщення стовпчика іноземного ключа як INCLUDEстовпця для індексу
  • Індексує стовпчик із зовнішнім ключем як другий стовпчик ключів
  • Індекси одного стовпця для іноземних ключових стовпців
  • Створення декількох індексів, що охоплюють, щоб увімкнути план "приєднання індексу" для зовнішнього ключа з декількома стовпцями

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

Відповіді:


13

Я розмовляв з людьми набагато розумнішими за мене, і ми скоро це документуємо ™.

Фактичне визначення цього проміжного часу:

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

В додаток:

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


6
Робочий приклад чи фактична документація були б чудовими. Пропозиція Баунті
Том V - Команда Моніки

3

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

Опублікована в блозі «Код» Карлоса Клаппа 1 березня 2013 року названаForeign Keys without Indexes «Збережена процедура», Util_FKsWithoutIndexesяка шукає зовнішні ключі, які не мають належних індексів для стосунків з ФК. (Схоже, цей блогер підняв це з центрального SQL Server The Ultimate Index-Less Foreign-Key Finder(15 жовтня 2009 р.) ) У блозі написано наступне:

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

Найкращі індекси часткового узгодження виводяться за допомогою порівнянь MatchCounts та стовпців

Створює шаблон CREATE INDEX для кожного зовнішнього ключа без індексу відповідності або індексу часткової відповідності.

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

FK-файли, які не мають повних відповідних індексів, можуть серйозно пошкодити продуктивність DELETES на таблиці з посиланням через сканування таблиць для перевірки референтної цілісності, а також SELECTS на референтних таблицях, де стовпці із зовнішнім ключем знаходяться в предикатах WHERE або JOIN (Це вплине на вас, чи існує обмеження, чи ні). Це перевіряє лише перші N стовпців індексу, де N - кількість стовпців у обмеженні іноземного ключа.

Порядок стовпців індексу не перевіряється за межами цього (двоколірний ФК, який має 1 узгоджуючий стовпець у 2-му стовпці 3-колонкового індексу, виводиться як часткове збіг)

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

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

Якщо я правильно це розумію, якщо у відношення ФК немає індексу, який відповідає кожному стовпцю в потрібному індексі, можуть бути деякі індекси, які мають деякі стовпці. Наприклад, якщо відносини FK має три колонки ( a, b, c) , але там немає індексу з тими ж трьома колонками, може існувати індекс , який має ( a, b) або ( a, c) або ( b, c) і може допомогти із запитами , але буде вимагають певного сканування покажчиків до рядків із відсутнім стовпцем.

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


Це те, що ти мав на увазі? Досі не можу змусити його працювати ... dbfiddle.uk/…
Джо Оббіш

Не зовсім. Спробуйте створити FK за допомогою (FKey2,FKey3)та створити індекс на FKey2. Будь ласка, спробуйте це.
RolandoMySQLDBA

Будь ласка, пам’ятайте, що я не хлопець SQL Server, але я просто намагаюся допомогти.
RolandoMySQLDBA

Я розумію і ціную будь-які ідеї, які можна спробувати. Я також не можу змусити дві колонки працювати.
Джо Оббіш

Ви можете піти в канаву create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3), увімкнути індекс FKey2і спробувати ще раз.
RolandoMySQLDBA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.