Обновление SQL только если отличается много столбцов - PullRequest
0 голосов
/ 30 сентября 2018

Существует обсуждение по обновлению поля, только если оно не равно

см. ОБНОВЛЕНИЕ, если отличается

Я хотел бы реализовать аналогично

UPDATE MyTable 
SET col1 = @newValue
WHERE Id = @Id AND col1 != @newValue

Однако вопрос заключается в том, как это сделать, если в таблице, например, 20 столбцов:

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

Или лучше сделать что-то вроде

 UPDATE xx 
 SET col1 = Value1, 
     col2 = Value2, 
     col3 = Value3...
 WHERE id = ID 
   AND (col1 != Value1 OR col2 != Value2 OR col3 != Value3)

Это обновит все 20 столбцов за один раз, даже если отличается только 1 столбец.Быстрее, если, например, 5 значений необходимо обновить.

1 Ответ

0 голосов
/ 30 сентября 2018

Ваш метод в порядке.Я бы использовал <> вместо !=, потому что это традиционный оператор неравенства в SQL.Возможно, вы захотите проверить значения NULL, но, похоже, это не проблема для этого вопроса.

Как правило, базы данных обновляют записи , а не столбцы .То есть вся запись считывается в память, значения изменяются, а затем вся запись записывается обратно в хранилище.Это упрощение - в кеше страниц есть блокировки, ведение журнала и грязные страницы, но оно отражает суть происходящего.

Затраты на update обычно связаны с записью, блокировкой и ведением журнала.боковая сторона.Это не имеет ничего общего с тем, какие поля обновляются.

Есть исключения из этого.Например, если вы используете базу данных columnstore, то каждый столбец хранится отдельно.В этом случае предпочтительным будет отдельное обновление для каждого столбца.

Аналогичным образом, если некоторые значения особенно велики, они могут храниться «вне страницы».И это может повлиять на производительность обновления.

Но, в целом, ваш подход к обеспечению того, что столбец некоторый изменился, вполне подходит.

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