Преимущества ограничения внешнего ключа SQL Server - PullRequest
7 голосов
/ 27 октября 2009

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

Я пробежался по некоторым интересным статьям и поискал в Google для практической пользы. Вот несколько ссылок:

http://www.mssqltips.com/tip.asp?tip=1296

Я хотел бы узнать больше о преимуществах FK (кроме формального структурирования и знаменитого каскадного удаления \ обновления).

  • FK по умолчанию не «индексируются», так каковы соображения при индексации FK?

  • Как обрабатывать пустые поля, которые отображаются как внешний ключ - это разрешено?

  • Помимо индексации, помогает ли это оптимизировать планы выполнения запросов в SQL-сервере?

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

Ответы [ 5 ]

9 голосов
/ 27 октября 2009
  • Внешние ключи не дают преимуществ производительности или масштабируемости.
  • Внешние ключи обеспечивают ссылочную целостность. Это может принести практическую пользу, вызывая ошибку, если кто-то попытался удалить строки из родительской таблицы по ошибке.
  • Внешние ключи не индексируются по умолчанию. Вам следует индексировать столбцы внешних ключей, так как это позволяет избежать сканирования таблицы дочерней таблицы при удалении / обновлении родительской строки.
  • Вы можете сделать столбец внешнего ключа обнуляемым и вставить ноль.
6 голосов
/ 27 октября 2009

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

У них нет никаких «функциональных» преимуществ, они не будут ничего оптимизировать. Вы все еще должны создавать индексы самостоятельно и т. Д. И да, вы можете иметь значения NULL в столбце, который является внешним ключом.

4 голосов
/ 27 октября 2009

FK ограничения сохраняют ваши данные согласованными. Вот и все. Это главное преимущество. Ограничения FK не обеспечат вам никакого прироста производительности.

Но, если вы не денормализовали целевую структуру БД, я бы порекомендовал вам использовать ограничения FK. Основная причина - последовательность.

3 голосов
/ 20 сентября 2011

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

1 голос
/ 27 октября 2009

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

Однако возможен косвенный выигрыш в производительности.

По крайней мере, для SQL Server столбцы в FK должны иметь одинаковый тип данных на каждой стороне. Без FK у вас может быть, например, родитель nvarchar и потомок varchar. Когда вы объедините две таблицы, вы получите преобразования типов данных, которые могут снизить производительность.

Пример: различные длины varchar, вызывающие проблему

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