大表的大量更新。如何加快速度?

时间:2019-07-04 19:24:36

标签: sql sql-server performance

我有一张大桌子(60列,200万行)。

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

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

通常用大SELECT CASE替换UPDATE列表吗?目前我有这样的东西:

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;

2 个答案:

答案 0 :(得分:0)

说实话,我很难理解目标是什么。如果您要从所有列中计算出一些大数据,也许您可​​以在所有计算中使用一些大型存储过程,也许那样便可以减少更新次数。

无论如何..由于速度是您要查找的参数,而不是空间量,那么您是否考虑过索引?如果您有大量更新,则可以考虑使用非聚集索引,这可以确保始终“加速”:)。

https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-2017

答案 1 :(得分:0)

--Requete 40. Performance cost: 3%
UPDATE #temp_arbo_of_3
SET PxAchat=NULL, CuTpsAch=NULL
WHERE IdBE IS NULL;


--Requete 41. Performance cost: 2%
UPDATE #temp_arbo_of_3
SET CuTrait = NULL
WHERE IdBE IS NOT NULL;


--Requete 42. Performance cost: 2%
UPDATE #temp_arbo_of_3
SET NrOF_Source = _ofI
WHERE IdBE IS NOT NULL;

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

--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%