5

我使用 SQL Server 已经很长时间了,当表之间存在逻辑连接时,我总是使用 FK 和索引

例子:

MyTable1
{
    ID      BIGINT IDENTITY (1, 1)  NOT NULL,
    SomeData    NVARCHAR(255)       NOT NULL,
    MyFK        BIGINT          NULL -- this is a FK to MyTable2.ID
}

MyTable2
{
    ID      BIGINT IDENTITY (1, 1)  NOT NULL,
    SomeData    NVARCHAR(255)       NOT NULL
}

现在问题来了,当我在 MyTable1 上执行一些更新 MyFK 的批量更新操作,同时对 MyTable2 执行插入语句时,我们会挂起直到发生超时或更新完成并释放锁。

据我所知,在插入具有 FK 的表时,数据库引擎需要锁定相关表以验证 FK,这就是问题的根源。

我试图解决问题的事情:

这两种解决方案都会导致我陷入僵局和表现不佳。

当我删除 FK 时,一切正常,但存在数据损坏的风险。

问题:

  1. 关于在哪里使用 FK 和在哪里不使用,是否有任何推荐的规则集?
  2. 除了删除 FK 来解决我的问题之外,您能否提供任何其他解决方案?
4

1 回答 1

2

以防万一asasfrob 找到的页面出现故障,它给出的答案是:

将父表 (TableA) 上的主键定义为非聚集索引。一旦你这样做了,问题就不会发生,因为查找将针对非聚集索引进行,并且不会处于锁定状态,因为 PK 列没有被修改。

于 2013-07-09T08:51:42.567 回答