如何优化这个 SQL 查询,因为我们总是在这个表中遇到死锁

问题描述 投票:0回答:1
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
sql-server query-optimization deadlock
1个回答
0
投票

我建议重写,这样你就可以使用

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
        )
© www.soinside.com 2019 - 2024. All rights reserved.