Я работаю с базой данных и хочу начать использовать с ней 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] ИДТИ
ИЗМЕНИТЬ ТАБЛИЦУ [dbo]. [ACI] С НОЧЕКОМ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_ACI_CustomerInformation] ИНОСТРАННЫЙ КЛЮЧ ([ACIOI]) ССЫЛКИ [dbo]. [CustomerInformation] ([ACI_OI]) НЕ ДЛЯ ЗАПИСИ ПЕРЕЙДИТЕ ИЗМЕНЕНИЕ ТАБЛИЦЫ [dbo]. [ACI] N ОГРАНИЧЕНИЕ [FK_ACI_CustomerInformation] GO
Разве ответ не до боли очевиден. Профилируйте нагрузку с ограничениями без проверки, а затем без них и сравните два прогона. Даже если кто-то дает вам ответ, зачем ему доверять, если ответ для вашей системы прост и может вызвать другие вопросы, которые вы даже не думали исследовать.


Это может иметь некоторое влияние, особенно на таких объемах. Однако сначала я бы протестировал это на похожей системе, чтобы вы могли измерить воздействие, если оно есть.
Честно говоря, я бы, вероятно, использовал для этого рукописные хранимые процедуры, чтобы вы могли оптимизировать их по мере необходимости, вместо использования LINQ to SQL.
Ответ может быть разным для разных сред (данные / журналы на одном диске, tempdb на одном диске, много кеша или мало и т. д.), Поэтому лучший способ узнать это - провести тест. Создайте две идентичные базы данных, одну с fk, а другую без. Выполните обычную загрузку миллиона строк в каждую базу данных и измерьте количество транзакций в секунду. Таким образом, вы будете знать наверняка в своей среде.
Я понимаю, что это старый вопрос, но я хочу прокомментировать, насколько плохой является практика создания FK, который не применяется к существующим данным. Если на самом деле требуется внешний ключ, вам необходимо исправить любые неверные данные перед добавлением внешнего ключа (который должен был быть добавлен во время разработки), а не пытаться игнорировать его. Все, что вы делаете, - это маскируете свою очень серьезную проблему целостности данных, отказываясь ее замечать и что-то делать. Иногда в этом возникает необходимость из-за изменившихся требований, но это не следует рассматривать как метод первого выбора при добавлении внешнего ключа в таблицу, содержащую данные. Обнаруживать и исправлять неверные данные следует.
Данные, не имеющие отношения к ПК, бесполезны. Если бы у меня была таблица заказов с идентификатором клиента, которого больше нет в таблице клиентов, как я узнал бы, кто заказал продукт? Конечно, именно поэтому FK следовало применять с самого начала, независимо от того, сделали ли вы вставку миллиона строк или нет. Я ежедневно вставляю многомиллионные строки через SSIS во многие таблицы с внешними ключами, и использование этого в качестве причины для отказа от их настройки в первую очередь указывает на непонимание структуры базы данных. Жертвовать целостностью данных ради скорости ВСЕГДА - плохая идея. Без целостности данных ваша база данных будет ненадежной и, следовательно, бесполезной.
Внешние ключи создадут некластеризованные индексы в вашей таблице, что улучшит производительность объединений по внешним ключам.
Дополнительные индексы снизят производительность ваших операторов вставки / обновления / удаления / слияния и увеличат размеры таблиц.
http://msdn.microsoft.com/en-us/library/ms191195.aspx
Даже когда они созданы с НЕ ДЛЯ ПОВТОРЕНИЯ, индексы все еще присутствуют, и SQL Server должен будет поддерживать их.
В вашем случае я бы либо: - использовать внешние ключи и снижать производительность или же - не использовать внешние ключи в производственной среде (прощай, целостность данных) и запускать мои тесты с копией производственной базы данных, для которой я бы создал внешние ключи.
Как бы вы добавили неиспользуемый внешний ключ?