2

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

- SELECT value * coeff from Table

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

我知道我可以试试看,但我相信你会对各种数据库引擎如何处理这个问题发表有趣的评论,以及我会做的少数测试会错过的事情。

4

2 回答 2

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

aaa然后在 SSMS 中编写脚本表

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

value显然,乘法升级了数据类型的精度/规模。CASE对这种意想不到的结果更加免疫。

于 2012-05-03T11:33:32.603 回答
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

对比

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 稍微少一些。然而,总时间几乎没有差异。

于 2012-05-03T09:30:06.453 回答