sql сервер - эффективный способ обновления таблицы из объединения - PullRequest
0 голосов
/ 04 марта 2020

Мне нужно обновить столбец suppID в таблице ordersTB из таблицы suppTB. Таблицы показаны ниже:

suppTB

suppID ,suppName , itemID ,....

ordersTB

itemID, suppID(added later so mostly null's)...

Какой самый эффективный способ обновить это Таблица. я пробовал этот запрос из старого Q здесь ( Как я могу сделать оператор UPDATE с JOIN в SQL? ), но он выполняется в течение дня и все еще работает

UPDATE ordersTB
SET A.suppID = B.suppID
FROM  ordersTB as A
JOIN  suppTB as B
    ON A.itemID = B.itemID
WHERE A.suppID is null

другие заметки и вещи, которые я пробовал:

  • обе таблицы имеют огромный размер (десятки миллионов)
  • столбцы itemID и suppID проиндексированы. Я удаляю индексы перед обновлением, чтобы сделать его быстрее. все еще занимает слишком много времени.
  • и попробуйте запрос MERGE. такие же результаты ..

1 Ответ

1 голос
/ 04 марта 2020

Обновление большого количества строк стоит дорого. Первым делом проверьте, обновляете ли вы каждую строку только один раз:

select s.item_ID, count(*)
from suppTB s
group by s.item_ID
having count(*) > 1
order by count(*) desc;

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

UPDATE o
SET suppID = s.suppID
FROM ordersTB o CROSS APPLY
     (SELECT TOP (1) s.*
      FROM suppTB s
      WHERE o.itemID = s.itemID
     )
WHERE o.suppID is null;

Если это не решит проблему, вам, вероятно, потребуется перезагрузить таблицу. Логика c выглядит примерно так:

select . . . , -- all columns except suppId
       s.suppId
into temp_ordersTb
from ordersTb o left join
     suppTb s
     on o.itemID = s.itemID;

truncate table ordersTb;

insert into ordersTb (. . .)
    select . . .
    from temp_ordersTb;

Конечно, прежде чем делать это, обязательно сделайте резервную копию своих таблиц!

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