我在DB2(IBM System I)表上有一个非常简单的SQL Update命令,该表保存约。 3000万条记录。
UPDATE tablename SET field = 0 where field > 0
现在,鉴于该领域永远不可能< 0 并且不可为空,是不是“where”子句不必要? WHERE子句是否会影响此过程的持续时间?
据我所知,这是不必要的,并且对速度有影响,因为数据库必须评估每条记录。我试图找到这个,因为我不能自己运行SQL,我们的分包商说它没有影响;我们没有证据证明/伪造它的知识。
答案 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.