SQL更新中WHERE子句的速度影响

时间:2016-04-12 07:51:59

标签: sql performance db2 where-clause

我在DB2(IBM System I)表上有一个非常简单的SQL Update命令,该表保存约。 3000万条记录。

UPDATE tablename SET field = 0 where field > 0 

现在,鉴于该领域永远不可能< 0 并且不可为空,是不是“where”子句不必要? WHERE子句是否会影响此过程的持续时间

据我所知,这是不必要的,并且对速度有影响,因为数据库必须评估每条记录。我试图找到这个,因为我不能自己运行SQL,我们的分包商说它没有影响;我们没有证据证明/伪造它的知识。

2 个答案:

答案 0 :(得分:2)

如果field的列类型可以为NULL,则会产生影响。 NULL将在field > 0中评估为false。如果仅在获得某些数据后将字段设置为值,即假设该字段表示今天发送的电子邮件,并且原始DBA允许field为NULL,即Unknown。如果你运行这个

UPDATE tablename SET field = 0;

每个人都会被重置,你无法找到有多少人从未发过电子邮件,即

select count(*) from tablename where field = NULL

因此,根据您的架构和语义,它可能意味着很多。请注意,这是一个示例,我并不是说它是一个很好的设计或很好用于NULL。

答案 1 :(得分:1)

结论:如果字段列中没有0,那么运行时中只有非常小的差异。 如果有几个0,那么很快就会变快 where子句很快就会在速度上获胜,如果字段列中有可能出现0,则imo应始终在查询中

我创建了一个包含4.967.877行的数据库表。

我用0填充了一半的行,另一半填充了1

UPDATE HugeDummyTable
SET field = 0
WHERE HugeDummyTableID < 2483938

UPDATE HugeDummyTable
SET field = 1
WHERE HugeDummyTableID >= 2483938

带有where:

的查询
SET STATISTICS TIME ON
UPDATE HugeDummyTable SET field = 0 where field > 0 

给出结果:

SQL Server Execution Times:
CPU time = 1829 ms,  elapsed time = 1842 ms.
(2483940 row(s) affected)

使用相同的第一个查询重置表。 在没有where

的情况下进行查询
SET STATISTICS TIME ON
UPDATE HugeDummyTable SET field = 0

给出了这个结果:

SQL Server Execution Times:
CPU time = 2765 ms,  elapsed time = 2791 ms.
(4967877 row(s) affected)

所以我认为哪里使查询更快。

评论后编辑:填写专栏&#39;字段&#39;随机数 为了确保我在2个试用版中使用相同的表,我会进行备份。

Update HugeDummyTable
SET field = ABS(Checksum(NewId()) % 100000)

看看我有多少0:

SELECT COUNT(field)
FROM HugeDummyTable
WHERE field = 0 
"45"

使用where:

运行查询
SET STATISTICS TIME ON
UPDATE HugeDummyTable SET field = 0 where field > 0

SQL Server Execution Times:
CPU time = 3313 ms,  elapsed time = 3325 ms.

(4967829 row(s) affected)

恢复的表格,没有在哪里重新:

SET STATISTICS TIME ON
UPDATE HugeDummyTable SET field = 0

SQL Server Execution Times:
CPU time = 3094 ms,  elapsed time = 3121 ms.

(4967877 row(s) affected)

差异较小,但仍然存在。这里似乎缩短了一点时间,即使只有45个记录差异。

编辑2:测试时没有0&#39>

这次字段列中没有0 没有地方

SQL Server Execution Times:
CPU time = 3109 ms,  elapsed time = 3238 ms.

在哪里

SQL Server Execution Times:
CPU time = 3172 ms,  elapsed time = 3337 ms.