我被引导相信,在T-SQL中进行单变量赋值时,set
是最好的方式,原因如下:
- 它是变量赋值的ANSI标准
- 相对于SELECT(对于单个变量),它实际上更快
所以...
SELECT @thingy = 'turnip shaped'
变成
SET @thingy = 'turnip shaped'
但是,什么样的速度才算快?我真的会注意到差别吗?
我被引导相信,在T-SQL中进行单变量赋值时,set
是最好的方式,原因如下:
所以...
SELECT @thingy = 'turnip shaped'
变成
SET @thingy = 'turnip shaped'
但是,什么样的速度才算快?我真的会注意到差别吗?
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
我认为速度不是问题,更多的是与任务特性集有关。我一段时间前发现了this,而且在SQL Server 2008中有一些新东西...我听说过,可以尝试谷歌搜索SQL Set vs Select SQL SERVER 2008。
看一下“执行计划”,它应该告诉你每个语句的成本