Снижается ли производительность добавление внешних ключей без принудительного исполнения в базу данных SQL Server 2008?

Я работаю с базой данных и хочу начать использовать с ней LINQ To SQL. Сейчас в базе данных нет никаких FK по соображениям производительности. Мы вставляем в БД миллионы строк за раз, поэтому нет никаких FK.

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

Кто-нибудь знает, каков может быть эффект от этого?

Обновление: я использую LINQ-To-SQL для непроизводительных интеллектуальных вещей. 80% доступа к данным осуществляется через хранимые процессы на производстве. Но для написания модульных тестов и других задач, не критичных к производительности, LINQ-To-SQL действительно упрощает доступ к данным.

Обновление: вот как вы добавляете необязательный FK

ALTER TABLE [dbo]. [ACI] WITH NOCHECK ADD CONSTRAINT [FK_ACI_CustomerInformation] FOREIGN KEY ([ACIOI]) ССЫЛКИ [dbo]. [CustomerInformation] ([ACI_OI]) НЕ ДЛЯ РЕПЛИКАЦИИ ИДТИ

ALTER TABLE [dbo]. [ACI] NOCHECK CONSTRAINT [FK_ACI_CustomerInformation] ИДТИ

Как бы вы добавили неиспользуемый внешний ключ?

Matt Brunell 21.01.2009 22:01

ИЗМЕНИТЬ ТАБЛИЦУ [dbo]. [ACI] С НОЧЕКОМ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_ACI_CustomerInformation] ИНОСТРАННЫЙ КЛЮЧ ([ACIOI]) ССЫЛКИ [dbo]. [CustomerInformation] ([ACI_OI]) НЕ ДЛЯ ЗАПИСИ ПЕРЕЙДИТЕ ИЗМЕНЕНИЕ ТАБЛИЦЫ [dbo]. [ACI] N ОГРАНИЧЕНИЕ [FK_ACI_CustomerInformation] GO

Paul Mendoza 21.01.2009 22:15

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

Mark Brady 26.01.2009 23:32
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
3
3
1 271
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Это может иметь некоторое влияние, особенно на таких объемах. Однако сначала я бы протестировал это на похожей системе, чтобы вы могли измерить воздействие, если оно есть.

Честно говоря, я бы, вероятно, использовал для этого рукописные хранимые процедуры, чтобы вы могли оптимизировать их по мере необходимости, вместо использования LINQ to SQL.

Ответ принят как подходящий

Ответ может быть разным для разных сред (данные / журналы на одном диске, tempdb на одном диске, много кеша или мало и т. д.), Поэтому лучший способ узнать это - провести тест. Создайте две идентичные базы данных, одну с fk, а другую без. Выполните обычную загрузку миллиона строк в каждую базу данных и измерьте количество транзакций в секунду. Таким образом, вы будете знать наверняка в своей среде.

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

Данные, не имеющие отношения к ПК, бесполезны. Если бы у меня была таблица заказов с идентификатором клиента, которого больше нет в таблице клиентов, как я узнал бы, кто заказал продукт? Конечно, именно поэтому FK следовало применять с самого начала, независимо от того, сделали ли вы вставку миллиона строк или нет. Я ежедневно вставляю многомиллионные строки через SSIS во многие таблицы с внешними ключами, и использование этого в качестве причины для отказа от их настройки в первую очередь указывает на непонимание структуры базы данных. Жертвовать целостностью данных ради скорости ВСЕГДА - плохая идея. Без целостности данных ваша база данных будет ненадежной и, следовательно, бесполезной.

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

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

http://msdn.microsoft.com/en-us/library/ms191195.aspx

Даже когда они созданы с НЕ ДЛЯ ПОВТОРЕНИЯ, индексы все еще присутствуют, и SQL Server должен будет поддерживать их.

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

Другие вопросы по теме