2009-10-27 2 views
7

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

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

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

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

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

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

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

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

ответ

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

Я обрабатывал несколько баз данных с несколькими миллионами записей. Много идет об импорте данных между базой данных и ее клоном, а затем использует этот клон в среде веб-приложений. Ну, я знал, что поддерживать индексы PK автоматически и, таким образом, помогает ускорить доступ к данным. Теперь из этого обсуждения я получаю, что если я использую JOINs в своих SQL-Queries, тогда я использую FK и индексирую его, чтобы сделать операции JOIN эффективными. –

+0

Например, у меня есть таблица OrgMaster (содержит все записи Org), тогда у меня есть таблица BookingMaster (содержит все записи бронирования). Теперь OrgMaster.Id ссылается на «BookingMaster.OrgId». Итак, у меня есть FK для отношений OrgId-to-Id, и я shud 'index' его для лучшей производительности любой операции JOIN между обеими этими таблицами. Я правильно понял?
Все вышеперечисленное - за счет дополнительных накладных расходов пространства и времени (при вставке записи в таблицу с помощью FK). –

+0

Я бы попросил, чтобы вы предоставили мне список вопросов, которые нужно учитывать, например: - Является ли индекс FK слишком много пространства, так как таблица растет на несколько миллионов записей? - В этом случае стоит ли искать FK-индекс «каждый раз»? - В каком случае изгоняюсь я НЕ применять FK или индекс его или делать ни один из него (конечно, я могу справиться с ЛА из приложения) - Любой другие хитрые ускоривой JOIN или другие такие трудоемкие поиски? –

6

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

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

+1

Не только код неисправного клиента. Известно, что пользователи «Buggy» и администраторы баз данных ошибаются при быстром устранении, непосредственно набрав команды SQL update! –

4

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

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

1

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

Однако может быть косвенное преимущество в производительности.

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

Example: different varchar lengths causing an issue

3

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