Должны ли всегда быть проиндексированы внешние ключи таблицы поиска? - PullRequest
3 голосов
/ 23 июня 2009

Если у меня есть справочная таблица с очень небольшим количеством записей (скажем, менее десяти), стоит ли мне ставить индекс для внешнего ключа другой таблицы, к которой она прикреплена? В связи с этим, нужна ли справочной таблице индекс первичного ключа?

В частности, есть ли выигрыш в производительности, который перевешивает издержки на обслуживание индексов? Если нет, есть ли какие-либо преимущества, кроме скорости?

Примечание: примером таблицы поиска может быть Статус заказа, где кортежи:

1 - Order Received
2 - In Process
3 - Shipped
4 - Paid

Ответы [ 5 ]

5 голосов
/ 23 июня 2009

В транзакционной системе может не быть существенного преимущества для помещения индекса в такой столбец (то есть в столбец ссылок с низкой мощностью), поскольку оптимизатор запросов, вероятно, не будет его использовать. Он также будет генерировать дополнительный дисковый трафик при записи в таблицу, так как индексы должны быть обновлены. Поэтому для FK с низким количеством элементов в транзакционной базе данных обычно лучше не индексировать столбцы. Это особенно относится к системам большого объема.

Обратите внимание, что вам все еще может понадобиться FK для ссылочной целостности и что поиск FK в небольшой справочной таблице, вероятно, не будет генерировать ввод / вывод, поскольку таблица поиска почти всегда будет кэшироваться.

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

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

В Star Schema вы можете получить некоторую выгоду от индексации столбцов с низким числом элементов даже на SQL Server. Если вы выполняете высокоселективный запрос (т. Е. Тот, в котором оптимизатор запросов решает, что возвращаемый набор строк будет небольшим), то он может выполнить план «звездного запроса», в котором используется метод, известный как пересечение индекса.

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

Растровые индексы - это реальная победа для столбцов с низкой кардинальностью на платформах, таких как Oracle, которые их поддерживают, а SQL Server - нет. Несмотря на это, индексы с низким количеством элементов все еще могут участвовать в планах звездных запросов на SQL Server.

5 голосов
/ 23 июня 2009

Да, всегда есть индекс.

Оптимизатор запросов современной системы управления базами данных (СУБД) определит, какая из них быстрее: (1) фактически читает из индекса столбца, (2) выполняет полное сканирование таблицы.

Размер таблицы (в количестве строк) должен быть «достаточно большим» для использования рассматриваемого индекса.

4 голосов
/ 23 июня 2009

Да, обоим. Всегда указывайте как практическое правило .

Очки:

  • Вы также не можете настроить FK без уникального индекса в таблице поиска
  • Что если вы хотите удалить или обновить таблицу соответствия? Особенно случайно ...

Однако, говоря это, мы не всегда.

У нас очень OLTP-таблица (5 миллионов строк + в день) с несколькими родительскими таблицами. Мы индексируем только те столбцы FK, которые нам нужны. Мы предполагаем, что в некоторых родительских таблицах не удаляются / не обновляются ключи, поэтому мы сокращаем объем необходимой работы и занимаемое дисковое пространство.

Мы использовали dmvs SQL Server 2005, чтобы установить, что индексы не использовались. У нас все еще есть ФК.

3 голосов
/ 23 июня 2009

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

0 голосов
/ 23 июня 2009

На сервере sql первичным ключом является кластеризованный индекс, если его еще нет (кластеризованный индекс).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...