Sql 对一个大表进行大量更新。如何加速?

Sql 对一个大表进行大量更新。如何加速?,sql,sql-server,performance,Sql,Sql Server,Performance,我有一个大表(60列,200万行) 它首先通过递归查询构建,然后大多数列以自己的方式更新。 所有这些更新都非常缓慢(占全局持续时间的80%) 更新的顺序不能完全随机,因为某些列用作其他列计算的输入。但订单在某种程度上是免费的 用大型SELECT案例替换更新列表是常见做法吗?目前我有这样的想法: UPDATE t SET col1=col2/col3 WHERE col4 IS NULL AND col5 IS NOT NULL; --UPDATE Nr1 UPDATE t SET col23=

我有一个大表(60列,200万行)

它首先通过递归查询构建,然后大多数列以自己的方式更新。 所有这些更新都非常缓慢(占全局持续时间的80%)

更新的顺序不能完全随机,因为某些列用作其他列计算的输入。但订单在某种程度上是免费的

用大型SELECT案例替换更新列表是常见做法吗?目前我有这样的想法:

UPDATE t SET col1=col2/col3 WHERE col4 IS NULL AND col5 IS NOT NULL; --UPDATE Nr1

UPDATE t SET col23=col24+col25 WHERE col26 IS NULL; --UPDATE Nr2

...

UPDATE t SET col46=col47*col48 WHERE col1 IS NULL --UPDATE Nr50
它是否可以被以下内容所取代:

CREATE TABLE t2 AS
SELECT
CASE WHEN col4 IS NULL AND col5 IS NOT NULL THEN col2/col3 ELSE col1 END AS col1,
...
CASE WHEN col26 IS NULL THEN col24+col25 ELSE col23 END AS col23,
..
FROM t;

CREATE TABLE t3 AS
SELECT
col1,
col2,...,
CASE WHEN col1 IS NULL THEN col47*col48 ELSE col46 END AS col46
FROM t2;

老实说,我有点难以理解目标是什么。如果您要从所有列计算一些大的数据,那么您可以使用一些大的存储过程来完成所有的计算,这样您就可以减少更新的次数

无论如何。。另外,因为速度是你寻找的参数,而不是空间的数量,那么你考虑索引吗?如果你有很多更新,你可以考虑非聚集索引,这肯定总是“加速”:)/P>

现在,如果我将所有这些替换为:

--Requete 40. Performance cost: 3%
UPDATE #temp_arbo_of_3
SET PxAchat=CASE WHEN IdBE IS NULL THEN NULL ELSE PxAchat END,
     CuTpsAch=CASE WHEN IdBE IS NULL THEN NULL ELSE CuTpsAch END,
     CuTrait=CASE WHEN IdBE IS NOT NULL THEN NULL ELSE CuTrait END,
     NrOF_Source=CASE WHEN IdBE IS NOT NULL THEN _ofI ELSE NrOF_source END
WHERE IdBE IS NULL;

性能(如SQL Server执行计划所示)更好。3%+2%+2%>3%

“如何加速?”
通过发布表结构、示例数据和更新逻辑。提供演示和所需结果将有助于解决问题。您可以提供一个实际问题的简化示例吗?看看“计算列”:听起来架构设计需要重新思考。
--Requete 40. Performance cost: 3%
UPDATE #temp_arbo_of_3
SET PxAchat=CASE WHEN IdBE IS NULL THEN NULL ELSE PxAchat END,
     CuTpsAch=CASE WHEN IdBE IS NULL THEN NULL ELSE CuTpsAch END,
     CuTrait=CASE WHEN IdBE IS NOT NULL THEN NULL ELSE CuTrait END,
     NrOF_Source=CASE WHEN IdBE IS NOT NULL THEN _ofI ELSE NrOF_source END
WHERE IdBE IS NULL;