【问题标题】:Is there a performance hit by added nonenforced foreign keys to a SQL Server 2008 database?向 SQL Server 2008 数据库添加非强制外键是否会影响性能?
【发布时间】:2009-01-21 18:27:25
【问题描述】:

我正在使用数据库,我想开始使用 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 约束 [FK_ACI_CustomerInformation] 去吧

【问题讨论】:

  • 如何添加非强制外键?
  • ALTER TABLE [dbo].[ACI] WITH NOCHECK ADD CONSTRAINT [FK_ACI_CustomerInformation] FOREIGN KEY([ACIOI]) REFERENCES [dbo].[CustomerInformation] ([ACI_OI]) NOT FOR REPLICATION GO ALTER TABLE [dbo].[ACI] NOCHECK 约束 [FK_ACI_CustomerInformation] GO
  • 答案不是很明显。使用 nocheck 约束分析您的负载,然后不使用它们并比较两次运行。即使有人给了你一个答案,为什么要相信它,因为发现你的系统的答案很简单,并且可能会引发你甚至没有想过要探索的其他问题

标签: performance sql-server-2008 foreign-keys


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    额外的索引会降低插入/更新/删除/合并语句的性能,并会增加表的大小。

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

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

    在你的情况下,我会: - 使用外键并降低性能 或者 - 不要在生产中使用外键(再见数据完整性)并针对我将为其创建外键的生产数据库副本运行我的测试。

    【讨论】:

      【解决方案3】:

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

      说实话,我可能会为此使用手写存储过程,因此您可以根据需要优化它们,而不是使用 LINQ to SQL。

      【讨论】:

        【解决方案4】:

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

        与PK无关的数据是无用的。如果我有一个订单表,其客户 ID 不再存在于客户表中,我怎么知道谁订购了该产品?当然,这就是为什么无论您是否进行百万行插入,都应该从一开始就强制执行 FK。我每天通过 SSIS 对许多具有外键的表进行数百万行插入,以此作为不首先设置它们的原因表明缺乏对数据库设计的理解。牺牲数据完整性来提高速度总是一个糟糕的主意。没有数据完整性,您的数据库将不可靠,因此毫无用处。

        【讨论】:

          猜你喜欢
          • 2011-01-20
          • 1970-01-01
          • 1970-01-01
          • 2013-01-18
          • 2016-10-24
          • 2012-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多