T-SQL中SELECT和SET的速度比较问题

5

我被引导相信,在T-SQL中进行单变量赋值时,set是最好的方式,原因如下:

  • 它是变量赋值的ANSI标准
  • 相对于SELECT(对于单个变量),它实际上更快

所以...

SELECT @thingy = 'turnip shaped'

变成

SET @thingy  = 'turnip shaped'

但是,什么样的速度才算?我真的会注意到差别吗?

3个回答

9

SET 在单次运行中速度更快。这个很容易证明。无论是否有差别,都由您决定,但我更喜欢 SET,因为如果代码只是一个赋值操作,那么 SELECT 没有意义。 我更愿意将 SELECT 限制在从表、视图等选择语句中使用。

这里有一个样本脚本,将运行次数设置为1:

SET NOCOUNT ON

DECLARE @runs int
DECLARE @i int, @j int
SET @runs = 1
SET @i = 0
SET @j = 0

DECLARE @dtStartDate datetime, @dtEndDate datetime


WHILE @runs > 0
    BEGIN
        SET @j = 0
        SET @dtStartDate = CURRENT_TIMESTAMP
        WHILE @j < 1000000
            BEGIN
                SET @i = @j
                SET @j = @j + 1
            END
        SELECT @dtEndDate = CURRENT_TIMESTAMP
        SELECT DATEDIFF(millisecond, @dtStartDate, @dtEndDate) AS SET_MILLISECONDS


        SET @j = 0
        SET @dtStartDate = CURRENT_TIMESTAMP
        WHILE @j < 1000000
            BEGIN
                SELECT @i = @j
                SET @j = @j + 1
            END
        SELECT @dtEndDate = CURRENT_TIMESTAMP
        SELECT DATEDIFF(millisecond, @dtStartDate, @dtEndDate) AS SELECT_MILLISECONDS

        SET @runs = @runs - 1
    END

结果:

运行 #1:

SET_MILLISECONDS

5093

SELECT_MILLISECONDS

5186

运行 #2:

SET_MILLISECONDS

4876

SELECT_MILLISECONDS

5466

运行 #3:

SET_MILLISECONDS

4936

SELECT_MILLISECONDS

5453

运行 #4:

SET_MILLISECONDS

4920

SELECT_MILLISECONDS

5250

运行 #5:

SET_MILLISECONDS

4860

SELECT_MILLISECONDS

5093

奇怪的是,如果你把运行次数增加到10次,SET操作开始滞后。

这是10次运行的结果:

SET_MILLISECONDS

5140

SELECT_MILLISECONDS

5266

SET_MILLISECONDS

5250

SELECT_MILLISECONDS

5466

SET_MILLISECONDS

5220

SELECT_MILLISECONDS

5280

SET_MILLISECONDS

5376

SELECT_MILLISECONDS

5280

SET_MILLISECONDS

5233

SELECT_MILLISECONDS

5453

SET_MILLISECONDS

5343

SELECT_MILLISECONDS

5423

SET_MILLISECONDS

5360

SELECT_MILLISECONDS

5156

SET_MILLISECONDS

5686

SELECT_MILLISECONDS

5233

SET_MILLISECONDS

5436

SELECT_MILLISECONDS

5500

SET_MILLISECONDS

5610

SELECT_MILLISECONDS

5266


不错,这正是我在寻找的确凿证据!谢谢老兄! - ninesided

1

我认为速度不是问题,更多的是与任务特性集有关。我一段时间前发现了this,而且在SQL Server 2008中有一些新东西...我听说过,可以尝试谷歌搜索SQL Set vs Select SQL SERVER 2008。


我想这就是我们在这里的原因...为了获取答案。 - Saif Khan
你会如何回答这个问题:http://stackoverflow.com/questions/189610/speed-of-mulitple-variable-assignment-in-t-sql - Saif Khan
我怀疑你说的有点对,我认为可能是其中一个使用的 CPU 时间比另一个少,但是我不确定如何验证这一点。 - ninesided

0

看一下“执行计划”,它应该告诉你每个语句的成本


1
如果您查看这两个的执行计划,您会发现它们的成本都为零。 - ninesided
那基本上就是你的答案了,成本微不足道,所以我建议你坚持使用SET。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接