Что такое «Частичный индекс соответствия»?

27

Я пытаюсь узнать больше об операторе плана запроса «проверка ссылок на внешние ключи», представленном в SQL Server 2016. Там не так много информации об этом. Microsoft объявила об этом здесь, и я написал об этом здесь . Новый оператор можно увидеть, удалив строку из родительской таблицы с 254 или более входящими ссылками внешнего ключа: ссылка dbfiddle .

В подробностях оператора отображаются три разных значения:

ФК проверить детали

  • Счетчик ссылок на внешние ключи - это количество входящих внешних ключей.
  • Нет соответствующих индексов Количество - это количество входящих внешних ключей без подходящего индекса. Проверка того, что обновленная или удаленная таблица не нарушит это ограничение, потребует сканирования дочерней таблицы.
  • Я не знаю, что представляет собой Частичное совпадение индексов .

Что такое индекс частичного соответствия в этом контексте? Я не смог заставить работать одно из следующих действий:

  • Отфильтрованные индексы
  • Помещение столбца внешнего ключа в качестве INCLUDEстолбца для индекса
  • Индексы со столбцом внешнего ключа в качестве второго ключевого столбца
  • Индексы одного столбца для внешних ключей нескольких столбцов
  • Создание нескольких покрывающих индексов для включения плана «соединения индекса» для внешнего ключа из нескольких столбцов

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

Джо Оббиш
источник

Ответы:

13

Я говорил с людьми намного умнее меня, и мы скоро это запишем ™.

Фактическое определение этого, тем временем:

PartialMatchingIndexCount отражает количество ссылок, которые можно проверить с помощью поиска индекса, но ключ индекса не охватывает все проверяемые столбцы. Например, соответствующие элементы ForeignKeyReferenceCheck содержат как элемент «Предикаты поиска», так и элемент «Предикат».

К тому же:

Если это число больше 0, возможна проблема с производительностью, если частичное совпадение приведет к большому количеству строк.

Шон говорит Удалить Сару Чиппс
источник
6
Рабочий пример или фактическая документация были бы великолепны. Награда предложена
Том V - Команда Моника
3

После еще нескольких поисков мне удалось найти пост, в котором упоминаются «Частично совпадающие индексы» и «Внешние ключи».

В записи блога от 1 марта 2013 года в блоге Карлоса Клэпа под названиемForeign Keys without Indexes «Вызывается хранимая процедура», Util_FKsWithoutIndexesкоторая ищет внешние ключи, которые не имеют надлежащих индексов для связей FK. (Похоже, этот блоггер поднял это из SQL Server Central The Ultimate Index-Less Foreign-Key Finder(15 октября 2009 г.) ) В блоге говорится следующее:

Ищет ограничения внешнего ключа, которые не имеют полностью совпадающих индексов.

Лучшие индексы частичного соответствия выводятся с помощью MatchCounts и сравнения столбцов

Создает шаблон CREATE INDEX для каждого внешнего ключа без индекса соответствия или индекса частичного соответствия.

Настройте по мере необходимости (добавьте, если хотите, чтобы он был кластеризован, или если он должен быть частью первичного ключа, или если вы хотите объединить с другим индексом)

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

Порядок столбцов индекса не проверяется за этим (FK с двумя столбцами, имеющий 1 соответствующий столбец во втором столбце 3-столбного индекса, будет выведен как частичное совпадение)

Если ваша база данных не имеет ограничений по внешнему ключу, тогда этот инструмент будет бесполезен для вас.

Многие базы данных имеют частичное покрытие ограничений внешнего ключа. Это работает только для связанных таблиц, где объявлены ограничения.

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

Если вообще нет индексов, которые могут поддерживать ограничение FK, то «Счетчик частичных совпадений индексов» будет равен нулю ( 0) или, по крайней мере, не будет увеличивать это число.

RolandoMySQLDBA
источник
Это то, что вы имели в виду? Все еще не могу заставить его работать ... 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