Будет ли какое-либо увеличение производительности при реализации правильного ограничения?
Да, скорее всего, будет.
Представьте, что вы хотите вставить "дочернюю" строкукоторый не может существовать без соответствующей «родительской» строки. Как бы вы проверили это в хранимой процедуре?
Ну, наивно, вы бы:
IF EXISTS (SELECT * FROM PARENT WHERE ...)
INSERT INTO CHILD VALUES (...);
ELSE
THROW ...;
Но, конечно, параллельная транзакция может удалить родительскую строку между IF и INSERT,поэтому вам нужно заблокировать родительскую строку:
...SELECT * FROM PARENT WITH(UPDLOCK)...
Но теперь эта блокировка удерживается до конца транзакции, блокируя любого, кто хочет изменить родительский элемент. Или SQL Server может принять решение перейти к блокировке таблицы, после чего ваш параллелизм уйдет в тупик ...
Разрешение принудительного использования базой данных FK, вероятно, позволит повысить параллелизм и повысить производительность.
В запросе SELECT также могут использоваться декларативные внешние ключи.
Если у вас есть INNER JOIN, но вы выбираете столбцы только из дочерней таблицы, оптимизатор запросов может полностью пропустить доступ к родительской таблице - он уже знает,что если дочерняя строка существует, родительская строка тоже должна существовать, поэтому ей не нужно явно проверять наличие родительских элементов.
Простое исключение родительского элемента из запроса достаточно просто, если у вас есть только один запрос, номожет быть не очень практичным, если у вас есть слои представлений и встроенных табличных функций. В этом случае вы захотите повторно использовать существующий код, не изменяя его, просто чтобы отбросить «лишнюю» обработку, которая вам не нужна, поэтому вы можете позволить оптимизатору запросов отбросить его для вас.