3

我正在使用数据库,我想开始使用 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]) REFERENCES [dbo].[CustomerInformation] ([ACI_OI]) NOT FOR REPLICATION GO

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

4

4 回答 4

3

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

于 2009-01-23T15:27:56.373 回答
1

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

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

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

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

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

于 2009-11-11T16:24:22.340 回答
0

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

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

于 2009-01-21T18:38:23.293 回答
0

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

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

于 2009-11-11T16:04:34.747 回答