Скорость SELECT против SET в T-SQL
Я был убежден, что для назначения одной переменной в T-SQL, set
это лучший способ сделать это по двум причинам:
- это стандарт ANSI для назначения переменных
- это на самом деле быстрее, чем делать SELECT (для одной переменной)
Так...
SELECT @thingy = 'turnip shaped'
становится
SET @thingy = 'turnip shaped'
Но как быстро, быстро? Я действительно когда-нибудь замечу разницу?
3 ответа
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 серий, скажем, 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
Я не думаю, что скорость - это проблема, она связана с набором функций назначения. Я сталкивался с этим некоторое время назад, и в SQL Server 2008 есть что-то новое... Я слышал, попробуйте поискать в Google SQL Set vs Select SQL SERVER 2008
Взгляните на "план выполнения", в нем должна быть указана стоимость каждой строки вашего заявления