Скорость SELECT против SET в T-SQL - PullRequest
5 голосов
/ 10 октября 2008

Я был убежден, что для назначения одной переменной в T-SQL, set - это лучший способ добиться цели по двум причинам:

  • это стандарт ANSI для присвоения переменных
  • это на самом деле быстрее, чем делать SELECT (для одной переменной)

Итак ...

SELECT @thingy = 'turnip shaped'

становится

SET @thingy  = 'turnip shaped'

Но как быстро, быстро ? Я действительно когда-нибудь почувствую разницу?

Ответы [ 3 ]

9 голосов
/ 10 октября 2008

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

1 голос
/ 10 октября 2008

У меня нет скорости - это проблема, она связана с набором функций назначения. Я сталкивался с этим некоторое время назад, и в SQL Server 2008 появилось что-то новое ... Я слышал, попробуйте поискать в Google SQL Set vs Select SQL SERVER 2008

0 голосов
/ 10 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...