Внешние ключи являются инструментом ссылочной целостности, не инструментом производительности. По крайней мере, в SQL Server, создание FK не создает связанный индекс, и необходимо создать индексы на всех полях FK для улучшения, ищут времена.
Внешний ключ является понятием DBMS для обеспечения целостности БД.
Любые последствия/улучшения производительности будут характерны для используемой технологии базы данных и вторичны к цели внешнего ключа.
Это - хорошая практика в SQL Server, чтобы гарантировать, чтобы все внешние ключи имели, по крайней мере, не кластерный индекс на них.
я надеюсь, что это разрешает вещи для Вас, но не стесняйтесь запрашивать больше деталей.
Внешние ключи могут улучшиться (и причинить боль), производительность
, Как указано здесь: Внешние ключи повышают производительность
, необходимо всегда создавать индексы на столбцах FK для сокращения поисков. SQL Server не делает этого автоматически.
Редактирование
Как ссылка теперь, кажется, мертво (благодарность Chris для того, чтобы замечать) , после шоу суть того, почему внешние ключи могут улучшиться (и причинить боль), производительность.
Может Внешний ключ улучшать производительность
, ограничение Внешнего ключа улучшает производительность во время чтения данных, но в то же время это замедляет производительность во время вставки / изменяющий / удаление данных.
В случае чтения запроса, оптимизатор может использовать ограничения внешнего ключа для создания более эффективных планов запросов, как ограничения внешнего ключа пред заявленные правила. Это обычно включает пропуск некоторой части плана запросов, потому что, например, оптимизатор видит, что из-за ограничения внешнего ключа, является ненужным выполнить ту конкретную часть плана.
Ваша лучшая ставка производительности должна использовать Индексы на полях, которые Вы часто используете. При использовании SQL Server, можно использовать профилировщика, чтобы представить определенную базу данных и взять файл, что выводы и используют настраивающийся мастер для получения рекомендаций на том, куда поместить индексы. Мне также нравится использовать профилировщика для спугивания длительных хранимых процедур, у меня есть лучшие десять худших списков преступников, которые я публикую каждую неделю, сохраняет людей честными :D.
@
прежде someone' s имя пользователя, тот человек получит уведомление, когда они войдут в систему, видят, что у них есть сообщение),
– James McNellis
28 October 2010 в 16:51
Я не знаю много о SQL-сервере, но в случае Oracle, имение столбца внешнего ключа уменьшает выполнение загрузки данных. Это вызвано тем, что база данных должна проверить, что целостность данных для каждого вставляет. И да, поскольку это уже упоминается, имение индекса на столбце внешнего ключа является хорошей практикой.
Можно использовать его, чтобы помочь сделать запрос более эффективным. Это действительно позволяет Вам реструктурировать запросы в SQL Server для использования внешнего объединения вместо внутреннего, которое удаляет необходимость SQL-серверов необходимости проверить, существует ли пустой указатель в столбце. Вы уже не должны вставлять тот спецификатор потому что отношения внешнего ключа inforces это для Вас.
Так это:
select p.ProductId, p.Name, c.CategoryId, c.Name AS Category
from Products p inner join ProductCategories c on p.CategoryId = c.CategoryIdwhere c.CategoryId = 1;
Становится этим:
SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category
FROM ProductCategories c
LEFT OUTER JOIN Products P ON
c.CategoryId = p.CategoryId
WHERE c.CategoryId = 1;
Это не обязательно сделает огромную производительность в небольших запросах, но когда таблицы станут большими, это может быть более эффективно.
main()
имеет тот же эффект как вызов exit()
с дополнительным преимуществом, что любые локальные переменные в main()
уничтожаются.
– James McNellis
28 October 2010 в 09:57