我有一张大桌子(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;
答案 0 :(得分:0)
说实话,我很难理解目标是什么。如果您要从所有列中计算出一些大数据,也许您可以在所有计算中使用一些大型存储过程,也许那样便可以减少更新次数。
无论如何..由于速度是您要查找的参数,而不是空间量,那么您是否考虑过索引?如果您有大量更新,则可以考虑使用非聚集索引,这可以确保始终“加速”:)。
答案 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%