5

私は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

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

    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;

結果

セット平均: 2418.44
selectAverage: 1037.52

setAverage : 2513.8
selectAverage : 1025.98

セット平均: 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

    While @counter < 1000000
    Begin
        set @a=1
        set @b=2
        set @c=3
        set @d=4
        set @e=5
        set @counter = @counter + 1
    End

結果

setAverage : 2518.58
selectAverage: 2504.44

setAverage : 2474.5
selectAverage : 2529.48

setAverage : 2511.22
selectAverage: 2514.04

結果はそれらが同じであることを意味します

つまり、1 つの変数を設定する必要がある場合Selectは、将来 cuz を使用することを好む別の,@w=3変数を設定する場合は追加されるだけですが、複数の変数を反抗的に設定する場合は、Select それを使用する必要があります。実行された

しかし、なぜ最初のテストSelectよりも速いのだろうかと思っていました。Set

4

1 に答える 1

7

そうではありません (少なくとも現在の例では)、ループの反復ごとに 6 つの SET ステートメントと 1 つの 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

これにより、違いがあるかどうかをより正確に示すことができます。

于 2012-08-18T06:37:41.750 に答える