Скорость 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

Взгляните на "план выполнения", в нем должна быть указана стоимость каждой строки вашего заявления

Другие вопросы по тегам