Разве плохо иметь некластеризованный индекс, содержащий первичный ключ из кластерного индекса?
Если у вас есть таблица с кластеризованным индексом по первичному ключу (int), является ли избыточным и плохим иметь один (или несколько) некластеризованных индексов, которые включают этот столбец первичного ключа в качестве одного из столбцов в некластеризованном индексе?
4 ответа
На самом деле могут быть веские причины для создания некластеризованного индекса, идентичного кластерному. Причина в том, что кластерные индексы несут багаж данных строк, и это может привести к очень низкой плотности строк. То есть. Вы можете иметь 2-3 строки на страницу из-за широких полей, которые не находятся в кластеризованном ключе, но ключ кластеризованного индекса имеет длину, скажем, 20 байтов. Наличие некластеризованного индекса с точно такими же ключом (ами) и порядком, что и у кластерного индекса, даст плотность в 2-3 сотни ключей на страницу. На многие агрегированные запросы, типичные для рабочей нагрузки OLAP/BI, можно более эффективно отвечать некластеризованным индексом, просто потому, что он уменьшает ввод-вывод в сотни раз.
Что касается некластеризованных индексов, которые содержат части кластеризованного ключа или даже одинаковые ключи, но в другом порядке, то все ставки отключены, поскольку они, очевидно, могут использоваться для множества запросов.
Таким образом, ответ на ваш вопрос: это зависит.
Для более точного ответа вам нужно будет поделиться точной схемой ваших таблиц и точными запросами.
Да, как правило, в этом нет необходимости, поскольку столбцы кластеризованного индекса уже добавлены к каждой записи индекса в некластеризованном индексе.
Зачем? Значение кластеризованного ключа - это то, что действительно позволяет SQL Server "находить" строку данных - это "указатель" на фактические данные - так что очевидно, что он должен храниться в некластеризованном индексе. Если вы посмотрели "Смит, Джон" и вам нужно больше узнать об этом человеке, вам нужно перейти к фактическим данным -> и это делается путем включения значения ключа кластеризации в индексный узел индекс
Это значение кластеризованного ключа уже существует, и, следовательно, обычно оно является избыточным и необязательным, чтобы добавить это значение снова, явно, в ваш некластеризованный индекс. Это плохо, потому что это просто тратит впустую пространство, не давая вам никакой выгоды.
Я с Ремусом об этом - кластерный индекс на самом деле не является индексом - он говорит вам, как данные организованы по страницам. (В вашем случае это также первичный ключ, но это не обязательно должно быть то же самое). Некластеризованные индексы включают эту информацию локатора строки, так что да, это избыточно.
Но если некластеризованный индекс покрывает и закладку строки данных использовать не нужно, его можно использовать намного эффективнее, чем кластеризованный индекс, и эффективность увеличивается по мере того, как отношение размера строки данных к размер некластеризованного индекса увеличивается.
Я обнаружил, что если вы хорошо разбираетесь в путях доступа в рабочей нагрузке вашего запроса, то иногда можно использовать несколько выборочных, охватывающих некластеризованные индексы, чтобы полностью исключить выбор кластеризации - таблица кучи, PK и некоторые хорошие индексы, и все готово.
Там нет 100% ответа, но ответ почти определенно.
Другие индексы предназначены для помощи в объединениях и сортировке (как правило). Учитывая, что первичный ключ уже проиндексирован, если оптимизатор может присоединиться, основываясь на этом, он будет использовать это.
Если нужен другой индекс с точки зрения объединения / сортировки, какую дополнительную помощь может оказать включение PK в состав индекса? Если он не мог присоединиться на основе PK раньше, он не собирается сейчас. И это не очень поможет в сортировке.