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
它更容易编写,更快执行
但我想知道为什么Select
比Set
第一次测试更快?
它不是(至少在你当前的例子中),你为循环的每次迭代运行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)
这将更准确地指示是否存在差异.