结论:如果字段列不为0,则where在运行时只有很小的差异。
如果有几个 0 很快就会变得更快
where 子句很快就会在速度上获胜,如果字段列中可能存在 0,则 imo 应该始终在查询中
我创建了一个有 4.967.877 行的 db 表。
我用 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)
所以我认为 where 使查询更快。
在 cmets 之后编辑:用随机数填充“字段”列
为了确保我将在 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)
已恢复的表,没有 where 重新运行:
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)
差异较小,但仍然存在。 where 似乎切断了一点时间,即使只有 45 条记录的差异。
编辑 2:测试时没有 0
这次字段列没有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.