外键减速删除

dav*_*XYZ 4 sql database sql-server foreign-keys primary-key

我有一个表X,它有一个自动递增的ID列作为其主键.我有其他表A,B,C和D来补充表X中的信息.每个表都必须包含一个引用表X中的ID的列.我已经完成了这个并且在我的代码(Java)中我有一个将每个条目的ID返回到表X并在插入其他表时使用它的方法.一切都运作良好.

现在,我被建议将表A,B,C和D上的ID列分配为FOREIGN KEYS因为"这是正确的事情".我做到了 现在从表X中删除行需要花费大量时间才能完成.插入其他表也需要更长的时间.

请不要误解我的意思,我知道为什么外键与指定数据库中表的关系有关.但它开始似乎只是仪式而不是实际相关,特别是因为我的交易变得越来越慢.

问题:

1.为了保持关系正式指定而失去一些表现是否值得,即使它没有必要?

2.有什么方法可以加快我的交易速度并保持FOREIGN KEY规格.

谢谢.

答复

以下是表格的创建方式.

CREATE Tables SQL:

CREATE TABLE [dbo].[MainTableX](
    [col1] [smalldatetime] ,
    [col2] [varchar] (20) ,
    [ID] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_MainTableX] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)
)
GO


CREATE TABLE [dbo].[RelatedTableA](
    [differentID] [varchar] (50),
    [detail1] [varchar] (40),
    [detail2] [varchar] (40),
 CONSTRAINT [PK_RelatedTableA] PRIMARY KEY CLUSTERED 
(
    [differentID] ASC
)
GO

-- Tables B, C D are pretty much similar to table A
Run Code Online (Sandbox Code Playgroud)

添加外键SQL:

ALTER TABLE RelatedTableA ADD ID INT 
CONSTRAINT fk_refTableX_A FOREIGN KEY (ID)
REFERENCES MainTableX(ID) 
GO
-- Same thing with the other related tables
Run Code Online (Sandbox Code Playgroud)

我将外键列作为索引.现在我的查询又快了.

Create nonclustered index IX_RelatedTableA 
on RelatedTableA (ID) 
GO
Run Code Online (Sandbox Code Playgroud)

Lar*_*tig 5

如果FOREIGN KEY列被正确编入索引(这应该在声明中自动发生,我相信)那么你应该在最坏的情况下看到一个小的性能命中.请列出每个表的CREATE TABLE SQL,因为它听起来像是错误的.

SQL Server不会自动在FK列上创建索引,因此请确保自己执行此操作.

使用FOREIGN KEY关系的目的不是"正式声明"任何东西(或者在任何情况下都不这样做).相反,它为数据库引擎提供了足够的信息来强制数据的完整性.这意味着您不能错误地让您的应用程序添加或删除记录,以免违反关系.此外,使用数据库的其他应用程序(例如Management Studio)也不能这样做.正是由于这个原因 - 数据库引擎保证执行规则 - 声明约束很重要.