以下查询之间会有任何显着的速度差异吗?
- SELECT value * coeff from Table
- SELECT CASE WHEN coeff = 0 THEN 0 ELSE value END FROM Table
我知道我可以试试看,但我相信你会对各种数据库引擎如何处理这个问题发表有趣的评论,以及我会做的少数测试会错过的事情。
以下查询之间会有任何显着的速度差异吗?
- SELECT value * coeff from Table
- SELECT CASE WHEN coeff = 0 THEN 0 ELSE value END FROM Table
我知道我可以试试看,但我相信你会对各种数据库引擎如何处理这个问题发表有趣的评论,以及我会做的少数测试会错过的事情。
乘法列和大小写列之间的结果数据类型可能有所不同。
尝试这个
CREATE TABLE #Tmp (value DECIMAL(19, 2), coeff BIT)
INSERT #Tmp SELECT 15, 1
INSERT #Tmp SELECT 16, 0
SELECT value * coeff AS final_value_mult
, CASE WHEN coeff = 0 THEN 0 ELSE value END AS final_value_case
INTO aaa
FROM #Tmp
--DROP TABLE aaa, #Tmp
aaa
然后在 SSMS 中编写脚本表
CREATE TABLE [dbo].[aaa](
[final_value_mult] [decimal](38, 4) NULL,
[final_value_case] [decimal](19, 2) NULL
) ON [PRIMARY]
value
显然,乘法升级了数据类型的精度/规模。CASE
对这种意想不到的结果更加免疫。
不会有任何显着的速度差异。
在最低级别,您需要将这两个值加载到 CPU 中的寄存器中。那么差别大概...
Load coeff into register1
Load value into register2
If register1 is not 0, skip the next operation
Load 0 into register2
Return value in register2
对比
Load coeff into register1
Load value into register2
register2 = register1 * register2
Return value in register2
第二个始终是 4 次操作。当 coef 为非零时,第一个是 5 次操作。
但是第一个版本的操作非常简单。第二个中的乘法将更加密集。据我所知,0 或 1 的整数乘法仍然和你得到的一样快。但是,如果 VALUE 是浮点数,它将更加密集。
(这都是来自基本的工作知识,而不是任何专业知识。)
话虽如此,但是,差异将远小于从磁盘加载数据或通过 tcp/ip 传输。
您应该运行分析器并测量每个分析器使用的 CPU 周期。不是花的时间。您可能会发现一个版本比另一个版本使用的 CPU 稍微少一些。然而,总时间几乎没有差异。