обновление строк изменений - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть требование обновить пару тысяч строк в таблице, основываясь на том, произошли ли какие-либо изменения с любым из значений. На данный момент я просто обновляю все значения независимо, но мне было интересно, что было более эффективным. Должен ли я проверить все столбцы, чтобы увидеть, есть ли какие-либо изменения и обновления, или я должен просто обновить независимо. * 1001 например *

 update someTable Set
   column1 = somevalue,
   column2 = somevalue,
   column3 = somevalue,
   etc....
 from someTable inner join sometable2 on
   someTable.id = sometable2.id
 where 
   someTable.column1 != sometable2.column1 or
   someTable.column2 != sometable2.column2 or
   someTable.column2 != sometable2.column2 or
   etc etc......

Что быстрее и что лучше?

Ответы [ 3 ]

1 голос
/ 08 сентября 2011

См. Две статьи в блоге Пола Уайта.

  1. Влияние необновленных обновлений для обсуждения основной проблемы.
  2. НедокументированноеПланы запросов: Сравнение равенства для менее утомительного способа сравнения неравенства, особенно если ваши столбцы обнуляются (WHERE NOT EXISTS (SELECT someTable.* INTERSECT SELECT someTable2.*)).
0 голосов
/ 08 сентября 2011

Я считаю, что это лучший способ.

Таблицы и данные:

declare @someTable1 table(id int, column1 int, column2 varchar(2))
declare @someTable2 table(id int, column1 int, column2 varchar(2))

insert @someTable1 
          select 1,10 a, 'a3'
union all select 2,20  , 'a3' 
union all select 3,null, 'a4'

insert @someTable2
          select 1,10,   'a3' 
union all select 2,19,   'a3' 
union all select 3,null, 'a5'

Обновление:

UPDATE t1
set t1.column1 = t2.column1,
t1.column2 = t2.column2
from @someTable1 t1
JOIN 
(select * from @someTable2
EXCEPT
select * from @someTable1) t2
on t2.id = t1.id

Результат:

select * from @someTable1

id          a        b
----------- -------- --
1           10       a3
2           19       a3
3           NULL     a5
0 голосов
/ 08 сентября 2011

Я обнаружил, что в явном виде, включая предложение where, исключаются неактивные обновления, которые выполняются быстрее при работе с большими таблицами, но это вопрос типа YMMV.

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

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