Sql 对一个大表进行大量更新。如何加速?
我有一个大表(60列,200万行) 它首先通过递归查询构建,然后大多数列以自己的方式更新。 所有这些更新都非常缓慢(占全局持续时间的80%) 更新的顺序不能完全随机,因为某些列用作其他列计算的输入。但订单在某种程度上是免费的 用大型SELECT案例替换更新列表是常见做法吗?目前我有这样的想法: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=
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;