我有一个表X有一个自动递增的ID列作为其主键。我有其他表A,B,C和D,它们补充表X中的信息。每个表都必须包含一个引用表X中的ID的列。我已经完成了这一步,并且在我的代码中(Java)将每个条目的ID返回到表X并在插入到其他表时使用该表的方法。一切正常。外键缓慢删除
现在,我被建议将表A,B,C和D上的ID列指定为FOREIGN KEYS,因为“这是正确的做法”。我做到了。 现在从表X中删除行需要花费大量的时间来完成。插入其他表格也需要更长的时间。
请不要误解我的意思,我知道为什么外键与指定DB上表的关系有关。但是,这似乎只是仪式而非实际相关,特别是当我的交易变得越来越慢时。
问题:
1.是否值得失去力图保持正式指定,即使它不是必要的关系有些表现?
2.有什么办法可以加快我的交易,仍然保持FOREIGN KEY规范。
谢谢。
REPLIES
这里是如何的表创建。
创建表的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
添加外键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
SOLUTION
我所做的外键列的索引。现在我的查询又快了。
Create nonclustered index IX_RelatedTableA
on RelatedTableA (ID)
GO
“这不是必要的”是什么意思?要么你想要数据完整性,要么你不需要。 –
这只是我的看法,因为我的程序在没有它的情况下运行得更快。这可能是我在其他地方犯了一个错误。这就是我寻求帮助的原因。 – davidXYZ