Пакетные обновления SQL для большой таблицы со многими индексами - PullRequest
0 голосов
/ 22 мая 2018

У нас есть таблица с 18 столбцами, из них 7 битовых столбцов, с более чем 100 миллионами строк.Он имеет 6 некластеризованных индексов, 5 из которых содержат столбец, который мне нужно обновить.

Первичный ключ (кластеризованный) - это уникальный идентификатор, называемый EntityID

Мне нужно обновить один избитовые флаги в этой таблице с использованием другой таблицы, которая содержит значения, которые мне нужно синхронизировать.Мой менеджер попросил меня написать обновление, которое будет запускаться партиями, так как даже самые маленькие обновления занимают время из-за всех индексов и количества строк в таблице.Он также попросил запустить обновление на основе ASC, отсортированного по EntityID, и упомянул кое-что об уменьшении количества читаемых страниц.

Я написал, вероятно, 5 разных версий отсортированного пакетного обновления, и они работают,но мне интересно посмотреть, есть ли уже хорошо отшлифованный шаблон, который я мог бы использовать для этого.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

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

  • сброситьиндексы
  • делают вставки / обновления
  • воссоздают индексы
0 голосов
/ 22 мая 2018
select 1 
while(@@rowcount > 0)
begin
    update top (100000) t
    set t.bit = s.bit 
    from table t 
    join tbls s 
      on s.EntityID = t.EntityID 
     and t.bit != s.bit
end

Я бы посоветовал против сортировки.Пусть оптимизатор запросов сделает свое дело.

Если у вас есть какой-либо t.bit нулевой, я бы сделал это отдельно, так как or замедляет обновление.

Я предлагаю вам отключить все индексы, обновить, а затем включить в индексах.

...