SQL:速度考虑:乘以0/1与条件操作相比

时间:2012-05-03 08:50:43

标签: sql sql-server

以下查询之间会有明显的速度差异吗?

- SELECT value * coeff from Table

- SELECT CASE WHEN coeff = 0 THEN 0 ELSE value END FROM Table

我知道我可以试试&看,但我相信你会对各种数据库引擎如何处理这些问题有一些有趣的评论,以及我将做的少数测试会遗漏的事情。

2 个答案:

答案 0 :(得分:1)

没有任何明显的速度差异。

在最低级别,您需要将两个值加载到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

VS

Load coeff into register1
Load value into register2
register2 = register1 * register2
Return value in register2

第二个总是4个操作。当coef非零时,第一个是5个操作。

但是第一个版本的操作非常简单。第二个中的乘法将更加密集。据我所知,0或1的整数乘法仍然和你得到的一样快。但是,如果VALUE是Float,则会更加密集。

(这完全来自基本的工作知识,而不是任何专业知识。)


但是,所有人都说,差异将远远小于从磁盘加载数据或通过tcp / ip传输数据。

您应该运行一个分析器并测量每个使用的CPU周期。不是时间。您可能会发现使用一个版本而不是另一个版本的CPU使用率略低。然而,总的时间几乎没有差别。

答案 1 :(得分:1)

乘法列和大小写列之间的结果数据类型可能存在差异。

试试这个

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

然后在SSMS中编写脚本表aaa

CREATE TABLE [dbo].[aaa](
    [final_value_mult] [decimal](38, 4) NULL,
    [final_value_case] [decimal](19, 2) NULL
) ON [PRIMARY]

显然,乘法会升级value数据类型的精度/比例。 CASE对这种意想不到的结果免疫力更强。