Составные таблицы, первичные ключи, внешний ключ и индексирование в SQL Server

У меня есть составная таблица под названием TeacherClass с двумя столбцами: TeacherID и ClassID. Первичный ключ - это как TeacherID, так и ClassID. Несмотря на то, что они также считаются внешними ключами, следует ли мне добавлять индекс к каждому столбцу отдельно, даже если у них есть один на обоих из них, объединенный с первичным ключом?


person Mike Flynn    schedule 02.03.2012    source источник


Ответы (2)


Если они оба являются частью PK, то, скорее всего, они уже находятся в кластеризованном индексе, но индекс будет иметь, скажем, (TeacherID, ClassID), а не наоборот (ClassID, TeacherID). Это означает, что таблица будет быстрой при выполнении чего-то вроде:

SELECT * FROM TeacherClass WHERE TeacherID = 9

Но медленно при беге

SELECT * FROM TeacherClass WHERE ClassID = 9

Если вы планируете запускать аналогичные операторы выбора, добавьте новый индекс, включая ClassID и TeacherID, в указанном порядке. Тогда вам не понадобятся отдельные индексы (наличие индекса, включающего Col1 и Col2, делает индекс, включающий только Col1, избыточным).

person Diego    schedule 02.03.2012

Если у вас есть первичный ключ на (TeacherID, ClassID), у вас уже есть индекс для этих двух.

Однако запрос, который использует только ClassID в качестве параметра, не сможет воспользоваться этим индексом - этот индекс работает только для (TeacherID) или (TeacherID, ClassID).

Итак, да - если столбец ClassID используется в качестве внешнего ключа в других таблицах, я определенно утверждаю, что вам следует разместить индекс только для (ClassID).

Однако указатель только на TeacherID совершенно излишен.

person marc_s    schedule 02.03.2012