UPDATE 
    WEB 
SET 
    WEB.ID_D_SUPPORT = DIM.ID_D_SUPPORT 
FROM 
    dbo.F_SUPPORT_WEB WEB
INNER JOIN 
    dbo.D_SUPPORT DIM 
    ON WEB.id_support = DIM.id_support 
    AND (WEB.date_creation BETWEEN DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid)

У меня есть этот запрос ниже с 300 миллионами строк в таблице F_SUPPORT_WEB для обновления, я не могу его запустить, каждый раз у меня возникает проблема с журналом транзакций. Я думаю, что оператор между является ключевым, но я не знаю, как его оптимизировать.

Кто-нибудь может мне помочь ?

0
imanebz 15 Апр 2016 в 15:30

3 ответа

Лучший ответ

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

UPDATE WEB 
SET WEB.ID_D_SUPPORT = DIM.ID_D_SUPPORT 
FROM dbo.F_SUPPORT_WEB WEB
INNER JOIN dbo.D_SUPPORT DIM ON WEB.id_support = DIM.id_support 
   AND (WEB.date_creation BETWEEN DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid)
WHERE WEB.ID_D_SUPPORT <> DIM.ID_D_SUPPORT 

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

1
UnhandledExcepSean 15 Апр 2016 в 12:59

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

SELECT 1 --Just to get a @@ROWCOUNT established
WHILE (@@ROWCOUNT > 0)
BEGIN
    UPDATE TOP (5000000) WEB --Change this number to however many you want to update at a time
    SET WEB.ID_D_SUPPORT = DIM.ID_D_SUPPORT 
    FROM dbo.F_SUPPORT_WEB WEB
    INNER JOIN dbo.D_SUPPORT DIM ON WEB.id_support = DIM.id_support 
               AND (WEB.date_creation BETWEEN DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid)
    WHERE WEB.ID_D_SUPPORT != DIM.ID_D_SUPPORT --Don't update records that have already been updated, otherwise the loop will run forever
END
1
Mike Deluca 15 Апр 2016 в 12:59
  1. создать временную таблицу Dim с dim.ids.
  2. массовая вставка только с идентификатором во временную таблицу DIM с DIM.Date_Deb_Valid И DIM.Date_Fin_Valid.
  3. сделать соединение с временной таблицей без (WEB.date_creation BETWEEN DIM.Date_Deb_Valid AND DIM.Date_Fin_Valid)
-1
Rom 15 Апр 2016 в 13:08