SET быстрее на отдельных запусках. Вы можете доказать это достаточно легко. Независимо от того, имеет ли это значение, зависит от вас, но я предпочитаю SET, поскольку я не вижу смысла в SELECT, если весь код выполняет присваивание. Я предпочитаю ограничивать 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