小编Ole*_*g I的帖子

使用 FOREIGN KEY 上的显式单个 KEY 值克服 MERGE JOIN(INDEX SCAN)

添加 7/11问题是由于 MERGE JOIN 期间的索引扫描而发生死锁。在这种情况下,一个事务试图在 FK 父表的整个索引上获得 S 锁,但之前另一个事务在索引的键值上放置了 X 锁。

让我从一个小例子开始(使用来自 70-461 课程的 TSQL2012 DB):

CREATE TABLE [Sales].[Orders](
[orderid] [int] IDENTITY(1,1) NOT NULL,
[custid] [int] NULL,
[empid] [int] NOT NULL,
[shipperid] [int] NOT NULL,
... )
Run Code Online (Sandbox Code Playgroud)

[custid], [empid], [shipperid]是相应的相关参数[Sales].[Customers], [HR].[Employees], [Sales].[Shippers]。在每种情况下,我们在父表中的引用列上都有一个聚集索引。

ALTER TABLE [Sales].[Orders]  WITH CHECK ADD  CONSTRAINT [FK_Orders_Customers] FOREIGN KEY([custid]) REFERENCES [Sales].[Customers] ([custid])
ALTER TABLE [Sales].[Orders]  WITH CHECK ADD  CONSTRAINT [FK_Orders_Employees] FOREIGN KEY([empid]) REFERENCES [HR].[Employees] ([empid])
ALTER TABLE [Sales].[Orders]  WITH CHECK ADD  CONSTRAINT …
Run Code Online (Sandbox Code Playgroud)

performance foreign-key deadlock optimization t-sql query-performance

10
推荐指数
1
解决办法
728
查看次数