SELECT
ITEMEXTRACTED, NEWID(), 'A', @USERID
FROM
(SELECT DISTINCT ITEMEXTRACTED
FROM @OUTPUTLINEITEM a
LEFT OUTER JOIN EXTRACTIONATTRIBUTE b WITH(NOLOC)
ON (a.itemextracted = b.attributetext AND b.isactive = 1)
WHERE b.AttributeText IS NULL) result
这个临时表也包含 900 行,这个总是陷入死锁的提取属性表包含 2000 万条记录。
我们也创建了如下非聚集索引,但问题仍未解决。
CREATE NONCLUSTERED INDEX [IX_NonClusteredIndexExtraction_AttributeText_ExtracAttId_Isactive]
ON [dbo].[ExtractionAttribute] ([AttributeText] ASC)
INCLUDE ([IsActive])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
我建议重写,这样你就可以使用
not exists
而避免使用 select distinct
:
SELECT
ITEMEXTRACTED
, NEWID()
, 'A'
, @USERID
FROM @OUTPUTLINEITEM a
WHERE NOT EXISTS (
SELECT NULL
FROM EXTRACTIONATTRIBUTE b WITH (NOLOCK)
WHERE a.itemextracted = b.attributetext
AND b.isactive = 1
)