Подтвердить что ты не робот

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

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

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


1) Термин запрос, кажется, вводит в заблуждение. Меня интересуют все виды штрафов за производительность.

2) Кто-нибудь имеет какие-либо реальные цифры о негативном воздействии на инструкции INSERT, DELETE или UPDATE (я знаю, что это зависит от конкретной системы, но, тем не менее, будут оценены любые измерения в реальном мире)?

4b9b3361

Ответ 1

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

Для запросов SELECT ограничения внешнего ключа не должны вносить никаких изменений в производительность.

Так как INSERTS почти всегда очень быстр, небольшое количество дополнительного времени не будет заметным, за исключением случаев, когда это возможно. (Создав базу данных размером в несколько гигабайт, вы можете отключить ограничения, а затем снова включить их, если вы уверены, что данные хороши.)

Ответ 2

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

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

Ответ 3

В теории да: для записи данных необходимо проверить ограничения.

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

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

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

My 2c: Никогда не нужно исправлять ошибки при выполнении некоторых неуловимых целей производительности. В очень редком случае, когда ограничения действительно являются проблемой, существуют измерения, показывающие, что случай, и, как говорится: если вы должны спросить, сколько это стоит, вы не можете этого себе позволить. Если вам нужно спросить, могут ли проблемы быть проблемой, вы не можете их удалить (не должно быть никакого нарушения).

Ответ 4

Для INSERT/UPDATE/DELETE короткий ответ: "Да". База данных должна будет проверить целостность ссылочной целостности и разрешить создание/модификацию. Или в случае DELETE может быть выполнено какое-то каскадирование.

Для SELECT это на самом деле совсем наоборот. У внешних ключей есть секретное преимущество, показывающее вам, где именно вы, скорее всего, выполняете сложные JOIN и имеете очень часто используемые поля. Это упрощает работу по индексированию, и вы можете в значительной степени гарантировать, что все ваши поля FK должны быть проиндексированы. Это делает SELECT намного быстрее.

Ответ 5

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

Вам нужно будет индексировать их, чтобы повысить производительность при выборе запросов.

Ответ 6

Проверка внешнего ключа занимает больше времени, чем думает большинство людей. Текущий тест с Oracle 11g и таблицей с двумя внешними ключами показал, что время для вставки около 800 000 строк заняло 60 секунд с включенными внешними ключами, но только 20 секунд без внешних ключей. (Конечно, столбцы внешнего ключа индексировались)

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

Ответ 7

Если внешние ключи оказали какое-либо влияние таким образом, это было бы на INSERTS. База данных выполняет референтную проверку внешних ключей, когда записи создаются/изменяются, а не SELECT.

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

Если вы применяете ссылочную целостность, INSERT и UPDATE, которые влияют на поле FK, будут медленнее. Однако об этом обычно не о чем беспокоиться, тем более, что многие БД 80% читают /20% пишут. Это также цена, которая стоит заплатить.

Создание индекса на внешнем ключе часто полезно, хотя очевидно, насколько это зависит от того, какие операторы SELECT вы используете.

Как правило, вам нужны внешние ключи из-за нормализации (что позволяет избежать дублирования данных и проблем синхронизации). Нормализуйте до 3-й степени, а затем, проанализировав реальную производительность, вы можете рассмотреть де-нормализацию.

Ответ 11

Внешние ключи замедляют вставки и изменения, так как каждая ссылка внешнего ключа должна быть проверена. Внешние ключи могут либо не влиять на выбор, либо ускорить его, в зависимости от того, использует ли СУБД индексацию внешнего ключа.

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

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

Конечно, все это предполагает, что используется проверка внешнего ключа.