Как работает обмен данными между двумя столбцами в SQL Server? - PullRequest
3 голосов
/ 12 февраля 2010

Я мог бы, вероятно, гуглить это, но это казалось довольно странным, что, возможно, стоило войти в качестве ответа на SA.

Так что в стране разработки, если вы хотите поменять местами значения двух переменных, вам понадобится третья временная переменная.

, например

string x = "ABC";
string y = "DEF";

string temp;

temp = x;
x = y;
y = temp;

Однако в SQL Update вы можете просто сказать

UPDATE table
SET ColumnA = ColumnB, ColumnB = ColumnA

Как это работает под капотом

  • Делает ли SQL Server снимок всей строки первым?
  • Делает ли SQL Server моментальный снимок всех строк, обновляемых за один раз?
  • Понимает ли оптимизатор, что выполняет обмен столбцами, и создает временную переменную за сценой?

Приветствия EoinC

Ответы [ 3 ]

4 голосов
/ 12 февраля 2010

Делает ли SQL Server снимок всей строки первым?

В некотором смысле, да, это так.

Это интересный сценарий, который подчеркивает разницу между декларативным и процедурным кодом. Давайте возьмем следующий пример:

UPDATE 
    users 
SET 
    first_name = last_name, 
    last_name = first_name,
    age = 55
WHERE
    user_id = 100

Оператор UPDATE будет работать примерно так:

  • Сначала проверяется предложение WHERE. Все строки, которые соответствуют предложению WHERE, будут помечены как подмножество. Если бы не было предложения WHERE, тогда вся таблица была бы помечена. Используя приведенный выше пример, мы могли бы иметь подмножество, подобное следующему:
    user_id  |  first_name  |  last_name  |  age  |  country
    ---------+--------------+-------------+-------+---------
    100      |  John        |  Doe        |  50   |  USA
  • Затем создается новое подмножество из предложения SET. Поля, которые не упомянуты в предложении SET, копируются из исходного подмножества.

    Поле age в новом подмножестве будет непосредственно присвоено значение 55. То же самое произойдет с полями first_name и last_name, но их новые значения назначения будут получены из исходного подмножества. Поле country копируется как есть из исходного подмножества, поскольку оно не было упомянуто в предложении SET.

    user_id  |  first_name  |  last_name  |  age  |  country
    ---------+--------------+-------------+-------+---------
    100      |  Doe         |  John       |  55   |  USA
  • Исходное подмножество затем удаляется из таблицы, и новое подмножество вставляется.
3 голосов
/ 12 февраля 2010

Чтобы добавить к gbn, это может помочь пониманию:

Хэллоуин защита

Чтение зафиксированного уровня изоляции

РЕДАКТИРОВАТЬ: На самом деле я хотел вставить это: Serializable против уровня изоляции моментального снимка . Но все равно, все равно стоит прочитать.

2 голосов
/ 12 февраля 2010

Команда SQL не является последовательной пошаговой операцией одна за другой. Это операция над множеством столбцов / строк за один раз.

SQL является декларативным . Вы говорите двигателю, что вы хотите, и он это делает. Ваш код клиента (и, возможно, ваше мышление) процедурный

Наконец, возможно, лучшее объяснение лежит в статье о " проблеме Хэллоуина ".

Примечание: внутреннее управление SQL Server может отличаться от Oracle, но обе эти проблемы решаются одинаково

...