如何在大型varchar字段和NOT EXISTS上使用JOIN加速SQL查询

And*_*ndy 1 sql t-sql sql-server performance

我有这个需要永远运行的查询.该表包含大约700万行.我正在做的其他事情(它是一个"临时"的永久表)相对较快(一个小时左右),而这一个UPDATE属于7个小时!我们有SQL Server 2014.

DOI是一个NVARCHAR(72)并且具有非唯一CLUSTERED索引. Affiliations是一个VARCHAR(8000).我真的不允许更改这些数据类型.Affiliations有一个索引作为包含.由于该领域如此之大,我们无法做出"常规"指数.

CREATE NONCLUSTERED INDEX IX_Affiliations 
    ON TempSourceTable (DOI) INCLUDE (Affiliations);
Run Code Online (Sandbox Code Playgroud)

如果a的所有记录DOI在其Affiliations列中具有相同的值,则以下语句的作用是将位字段设置为1 .此表每个DOI值有多个记录,我们想知道Affiliations具有相同DOI或不相同的所有记录的列是否相同.

有没有什么方法可以加快速度,写一个不同的查询,一个不同的索引,或者我这样做是错的吗?

UPDATE S
SET AffiliationsSameForAllDOI = 1
FROM TempSourceTable S
WHERE NOT EXISTS (SELECT 1 
                  FROM TempSourceTable S2 
                  WHERE S2.DOI = S.DOI 
                    AND S2.Affiliations <> S.Affiliations)
Run Code Online (Sandbox Code Playgroud)

Pரத*_*ீப் 6

这是另一种方式

SUB-QUERY

UPDATE TempSourceTable
SET    AffiliationsSameForAllDOI = 1
WHERE  doi IN (SELECT doi
               FROM   TempSourceTable S
               GROUP  BY DOI
               HAVING COUNT(DISTINCT Affiliations) = 1) 
Run Code Online (Sandbox Code Playgroud)

EXISTS

UPDATE TempSourceTable S
SET    AffiliationsSameForAllDOI = 1
WHERE EXISTS  (SELECT 1
               FROM   TempSourceTable S1
               Where s1.DOI = s.DOI
               HAVING COUNT(DISTINCT Affiliations) = 1) 
Run Code Online (Sandbox Code Playgroud)

INNER JOIN

UPDATE S 
SET    AffiliationsSameForAllDOI = 1
FROM TempSourceTable S
INNER JOIN (SELECT doi
            FROM   TempSourceTable 
            GROUP  BY DOI
            HAVING COUNT(DISTINCT Affiliations) = 1) S1
        ON S.DOI = S1.DOI
Run Code Online (Sandbox Code Playgroud)