为什么选择比Set语句更快

HB *_*AAM 5 .net c# sql sql-server

我做了2次基本测试

1-

Create Procedure [dbo].[SetLoop]
As Begin 
declare @counter int = 0 ,@a int,@b int,@c int,@d int,@e int
    While @counter < 1000000
    Begin
        set @a=1
        set @b=2
        set @c=3
        set @d=4
        set @e=5
        set @counter = @counter + 1
    End
End
Run Code Online (Sandbox Code Playgroud)
create procedure SelectLoop
As Begin 
declare @counter int =0 ,@a int,@b int,@c int,@d int,@e int
    While @counter < 1000000
    Begin
        select @a=1, @b=2, @c=3, @d=4, @e=5,@counter = @counter + 1
    End
End
Run Code Online (Sandbox Code Playgroud)
    var setTimes = new List<double>();
    for (var i = 0; i < 50; i++)
    {
        stopwatch.Start();
        dataContext.SetLoop();
        stopwatch.Stop();
        setTimes.Add(stopwatch.ElapsedMilliseconds);
        stopwatch.Reset();
    }

    var selectTimes = new List<double>();
    for (var i = 0; i < 50; i++)
    {
        stopwatch.Start();
        dataContext.SelectLoop();
        stopwatch.Stop();
        selectTimes.Add(stopwatch.ElapsedMilliseconds);
        stopwatch.Reset();
    }

    var setAverage = setTimes.Sum() / setTimes.Count;
    var selectAverage = selectTimes.Sum()/selectTimes.Count;
Run Code Online (Sandbox Code Playgroud)

结果

setAverage : 2418.44
selectAverage : 1037.52

setAverage : 2513.8
selectAverage : 1025.98

setAverage : 2496.52
selectAverage : 996.36

结果意味着选择比按one and half时间精确设置的速度快142.78%


2-

    While @counter < 1000000
    Begin
        select @a=1
        select @b=2
        select @c=3
        select @d=4
        select @e=5
        select @counter = @counter + 1
    End
Run Code Online (Sandbox Code Playgroud)
    While @counter < 1000000
    Begin
        set @a=1
        set @b=2
        set @c=3
        set @d=4
        set @e=5
        set @counter = @counter + 1
    End
Run Code Online (Sandbox Code Playgroud)

结果

setAverage : 2518.58
selectAverage : 2504.44

setAverage : 2474.5
selectAverage : 2529.48

setAverage : 2511.22
selectAverage : 2514.04

结果意味着它们是相同的

这意味着如果你需要设置一个变量Select而不是将来使用cuz如果你想设置另一个,@w=3变量就会被添加但是如果你想要设置多个变量你需要使用Select 它更容易编写,更快执行

但我想知道为什么SelectSet第一次测试更快?

Chr*_*int 7

它不是(至少在你当前的例子中),你为循环的每次迭代运行6个SET语句和一个SELECT语句,因此,我希望SELECT更快.

我建议比较喜欢;

CREATE Procedure [dbo].[SelectLoop]
As Begin 
declare @counter int = 0
    While @counter < 1000000
    Begin
        select @counter = @counter + 1
    End
End

CREATE Procedure [dbo].[SetLoop]
As Begin 
declare @counter int = 0
    While @counter < 1000000
    Begin
       set @counter = @counter + 1
    End
End
Run Code Online (Sandbox Code Playgroud)

这将更准确地指示是否存在差异.