Performance SQL Server 2008数据库中添加的非强制外键是否会影响性能?

Performance SQL Server 2008数据库中添加的非强制外键是否会影响性能?,performance,sql-server-2008,foreign-keys,Performance,Sql Server 2008,Foreign Keys,我正在处理一个数据库,我想开始使用LINQtoSQL。出于性能原因,数据库中目前没有任何FKs。我们一次向数据库插入数百万行,这就是为什么没有任何FK 所以我想我将向数据库中添加非强制FKs来描述LINQ to SQL表之间的关系,但我不希望添加非强制外键会影响性能 有人知道这会有什么影响吗 更新:我正在使用LINQtoSQL来处理非性能的有感染性的东西。80%的数据访问是通过生产上的存储过程进行的。但对于编写单元测试和其他非性能关键任务,LINQtoSQL使数据访问变得非常容易 更新:以下是如

我正在处理一个数据库,我想开始使用LINQtoSQL。出于性能原因,数据库中目前没有任何FKs。我们一次向数据库插入数百万行,这就是为什么没有任何FK

所以我想我将向数据库中添加非强制FKs来描述LINQ to SQL表之间的关系,但我不希望添加非强制外键会影响性能

有人知道这会有什么影响吗

更新:我正在使用LINQtoSQL来处理非性能的有感染性的东西。80%的数据访问是通过生产上的存储过程进行的。但对于编写单元测试和其他非性能关键任务,LINQtoSQL使数据访问变得非常容易

更新:以下是如何添加非增强FK


使用NOCHECK ADD CONSTRAINT[FK_ACI_CustomerInformation]外键([ACOI])更改表[dbo]。[ACI] 参考文献[dbo].[CustomerInformation]([ACI_OI]) 不适用于复制 去

ALTER TABLE[dbo].[ACI]NOCHECK约束[FK_ACI_CustomerInformation]
GO

它可能会产生一些影响,尤其是在那些卷上。
不过,我会先在一个类似的系统上进行测试,这样您就可以测量影响(如果有的话)


不过,老实说,我可能会使用手工编写的存储过程来实现这一点,因此您可以根据需要对其进行优化,而不是使用LINQ To SQL。

对于不同的环境(同一驱动器上的数据/日志、同一驱动器上的tempdb、大量缓存与少量缓存等),答案可能会有所不同,因此最好的方法是进行基准测试。创建两个相同的数据库,一个有fk,一个没有。将正常的百万行加载到每个数据库中,并测量每秒的事务量。这样,在您自己的环境中您就可以肯定了。

我意识到这是一个老问题,但我想谈谈创建一个不在现有数据上强制执行的FK的做法有多糟糕。如果实际上需要外键,则需要在添加外键(应在设计时添加)之前修复任何错误数据,而不要尝试忽略它。您所做的只是通过拒绝注意并采取措施来掩盖非常严重的数据完整性问题。由于需求的变化,偶尔需要这样做,但在向包含数据的表添加外键时,不应将其视为首选技术。查找和修复坏数据应该是非常重要的


与PK无关的数据是无用的。如果我有一个客户id不再存在于客户表中的订单表,我如何知道是谁订购了产品?当然,这就是为什么无论您是否进行了百万行插入,从一开始就应该强制执行FKs。我每天通过SSI向许多具有外键的表插入数百万行,以此作为一开始不设置外键的原因,这表明我对数据库设计缺乏了解。为了提高速度而牺牲数据完整性始终是一个糟糕的想法。如果没有数据完整性,您的数据库将不可靠,因此没有用处。

外键将在表中创建非聚集索引,这将提高外键联接的性能

额外的索引将降低insert/update/delete/merge语句的性能,并增加表的大小

即使使用NOT FOR REPLICATION创建索引,索引仍然存在,SQL Server也需要维护它们

就你而言,我会: -使用外键并进行性能测试 或
-在生产中不使用外键(再见数据完整性),并对我将为其创建外键的生产数据库副本运行测试。

如何添加非强制外键?使用NOCHECK add CONSTRAINT[FK_ACI_CustomerInformation]外键([ACOI])引用[dbo].[CustomerInformation]更改表[dbo].[ACI]([ACI_OI])不用于复制GO ALTER TABLE[dbo]。[ACI]NOCHECK约束[FK_ACI_CustomerInformation]答案不是显而易见的吗?先用nocheck约束来分析负载,然后不使用nocheck约束来比较两次运行。即使有人给了你答案,为什么要相信它呢?因为为你的系统找到答案很简单,可能会提出你从未想过要探究的其他问题