我有一个表,其中有100到500万条记录作为一个批处理,然后在它们上运行一些存储过程来更新和删除批处理中的记录。所有这些存储过程都使用两个字段来实现选择性,因此它们只在该批处理中的记录上运行。这两个字段都在非聚集索引中。有时,当多个批处理同时运行时,我不断地在批处理之间发生死锁,我假设是由于锁升级。尝试找出是否有一种方法可以在不完全重新设计的情况下解决这个问题,为每个批次使用专用表。禁用页面锁定是否会带来更多麻烦?
其他信息:
表结构和索引的示例(实际的表结构和索引的列比这个多得多)
CREATE TABLE [dbo].[TempImport](
[UID] [int] IDENTITY(1,1) NOT NULL,
[EID] [int] NULL,
[EXTID] [int] NULL,
[COL1] [varchar](50) NULL,
[COL2] [varchar](50) NULL,
CONSTRAINT [PK_TempImport] PRIMARY KEY CLUSTERED
(
[UID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_TempImport_Main] ON [dbo].[TempImport]
(
[EID] ASC,
[EXTID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO存储过程中的查询类型如下所示:
update TempImport set COL1 = 'foo' where EID = @EID and EXTID = @EXT and COL2='bar'批处理完成后发生的最后一件事是这样的:
Delete from TempImport where EID = @EID and EXTID = @EXT死锁通常涉及存储过程中的删除和更新。
如果还有其他有用的信息,请告诉我
发布于 2020-09-25 10:45:43
只是一些潜在的建议
请注意,如果您有其他东西访问/使用此表,那么它们也可能在此表上被阻塞或死锁,因此您的方法需要非常小心。
https://stackoverflow.com/questions/64053405
复制相似问题