Лучше заполнять переменные, используя SET или SELECT?

8

Как лучше (с точки зрения производительности) установить значение переменной?

  1. По SETкоманде:

    DECLARE @VarString nvarchar(max);
    SET @VarString = 'john doe';
    SELECT @VarString;
  2. По SELECTкоманде:

    DECLARE @VarString nvarchar(max);
    SELECT @VarString = 'john doe';
    SELECT @VarString;
Gadonski
источник
1
Использование SELECT не является семантическим, но мне интересно знать, работает ли он быстрее, чем SET.
Рафаэль Касснер
1
Вы можете захотеть взглянуть на эту stackoverflow.com/questions/189588/...
SQL Ученик
@RafaelKassner - SELECTбыстрее при назначении значений нескольким переменным одновременно . В противном случае разница в производительности незначительна.
Ник Чаммас
@SQLLearner - этот отчет дает неубедительные результаты. Сначала на плакате говорится, что SETэто быстрее, а затем на полпути вниз он добавляет: «Как ни странно, если вы увеличите количество прогонов, скажем, 10, то SETотстает».
Ник Чаммас

Ответы:

8

Не выбирайте одно или другое строго для производительности.

Выберите основанный на том, что соответствует вашему стилю и развитию потребностей, как рекомендуются в заключении к этому прекрасному сравнению SELECTиSET (курсив и второстепенное форматирование добавлены):

Лучшая практика предлагает не придерживаться одного метода. В зависимости от сценария вы можете использовать оба SETили SELECT.

Ниже приведены несколько сценариев использования SET:

  • Если вам необходимо присвоить одно значение непосредственно переменной, и для извлечения значения не требуется запрос
  • Ожидаются назначения NULL ( NULLвозвращаются в наборе результатов)
  • Стандарты предназначены для соблюдения любой запланированной миграции
  • Не скалярные результаты ожидаются и должны быть обработаны

Использование SELECTэффективно и гибко в следующих нескольких случаях:

  • Несколько переменных заполняются путем присвоения значений напрямую
  • Несколько переменных заполняются одним источником (таблица, представление)
  • Меньше кода для назначения нескольких переменных
  • Используйте это, если вам нужно получить @@ROWCOUNTи @ERRORдля последнего выполненного оператора
Ник Чаммас
источник
3

Я думаю, что консенсус в том, что разница между ними ничтожна (при том, SETчто они быстрее). Но если вы похожи на меня, я бы использовал, SETгде это уместно, для удобства чтения. Следующий парень, который будет поддерживать ваш код, поблагодарит вас за это ;-)

MarlonRibunal
источник
1
Можете ли вы опубликовать тесты, доказывающие, что SET работает быстрее?
АК
Алекс, посмотрите на это в качестве примера stackoverflow.com/questions/189588/…
MarlonRibunal
Марлон, этот отчет дает неубедительные результаты. Обратите внимание, что на полпути вниз плакат отмечает, что: «Как ни странно, если вы повернете число набегов, скажем, 10, SET начнет отставать».
Ник Чаммас
Вот почему мой ответ склоняется к «удобочитаемости». Сценарий использования в вашем ответе - это отличные моменты.
MarlonRibunal
2

Я всегда использую SET, если я не заполняю несколько переменных из набора результатов 1 запроса. Таким образом, используя SELECT, мы запрашиваем таблицу только один раз.

Винс Перголиззи
источник