Улучшает ли внешний ключ производительность запросов?

140
задан simhumileco 12 December 2017 в 17:41
поделиться

6 ответов

Внешние ключи являются инструментом ссылочной целостности, не инструментом производительности. По крайней мере, в SQL Server, создание FK не создает связанный индекс, и необходимо создать индексы на всех полях FK для улучшения, ищут времена.

179
ответ дан onedaywhen 12 December 2017 в 17:41
поделиться
  • 1
    Вы действительно отвечаете на downvote-события в течение 2 секунд? Поскольку я все еще заявлял причину, в то время как Вы уже кричите " Downvoter: Почему? ". / Хорошо. You' ve удалил Ваш крик снова, делая недействительным часть времени I' ve, потраченный / потраченный впустую. – Sebastian Mach 29 November 2010 в 23:37

Внешний ключ является понятием DBMS для обеспечения целостности БД.

Любые последствия/улучшения производительности будут характерны для используемой технологии базы данных и вторичны к цели внешнего ключа.

Это - хорошая практика в SQL Server, чтобы гарантировать, чтобы все внешние ключи имели, по крайней мере, не кластерный индекс на них.

я надеюсь, что это разрешает вещи для Вас, но не стесняйтесь запрашивать больше деталей.

14
ответ дан Matthew Haugen 12 December 2017 в 17:41
поделиться

Внешние ключи могут улучшиться (и причинить боль), производительность

  1. , Как указано здесь: Внешние ключи повышают производительность

  2. , необходимо всегда создавать индексы на столбцах FK для сокращения поисков. SQL Server не делает этого автоматически.

Редактирование

Как ссылка теперь, кажется, мертво (благодарность Chris для того, чтобы замечать) , после шоу суть того, почему внешние ключи могут улучшиться (и причинить боль), производительность.

Может Внешний ключ улучшать производительность

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

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

54
ответ дан Andrzej Doyle 12 December 2017 в 17:41
поделиться
  • 1
    Downvote для недостающей правовой оговорки о том, как это обходит счастливый мир RAII. – Sebastian Mach 29 November 2010 в 23:36

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

4
ответ дан Al Katawazi 12 December 2017 в 17:41
поделиться
  • 1
    То, что составляет надлежащее использование исключения, является спорным вопросом; это было просто моим мнением; I' m уверенный, если пять других людей здесь взвешиваются, we' ll имеют по крайней мере восемь различных мнений:-) (Добро пожаловать в Переполнение стека; как предостережение, если Вы помещаете @ прежде someone' s имя пользователя, тот человек получит уведомление, когда они войдут в систему, видят, что у них есть сообщение), – James McNellis 28 October 2010 в 16:51

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

0
ответ дан Shamik 12 December 2017 в 17:41
поделиться
  • 1
    James, у Вас есть я на станд.:: оконечный (). Да, станд.:: аварийное прекращение работы является лучшим выбором. Является ли исключение как stop_now_t соответствующим, зависит от того, как Вы структурировали свой алгоритм. Предоставленный в примере это простое это может быть плохой способ сделать это. Но я просто пытался проиллюстрировать, как могли использоваться исключения. – Bowie Owens 28 October 2010 в 15:39

Можно использовать его, чтобы помочь сделать запрос более эффективным. Это действительно позволяет Вам реструктурировать запросы в 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;

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

3
ответ дан kemiller2002 12 December 2017 в 17:41
поделиться
  • 1
    Почему? Возврат от main() имеет тот же эффект как вызов exit() с дополнительным преимуществом, что любые локальные переменные в main() уничтожаются. – James McNellis 28 October 2010 в 09:57
Другие вопросы по тегам:

Похожие вопросы: