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)
这是另一种方式
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)
| 归档时间: |
|
| 查看次数: |
707 次 |
| 最近记录: |