2013-08-15 3 views
1

Я хочу обновить таблицу в oracle, которая имеет 155.750 строк. я пишу это:Как я могу улучшить этот скрипт обновления?

UPDATE Table1 R 
SET R.TOTAL = 
(SELECT SUM(T.TOTALS_TO_DATE) 
FROM Table2 T 
WHERE T.ID= R.ID 
AND T.TYPE = 'type5'); 

Table1 имеет индекс на ID Table2 имеет индексы на ID и TYPE. Это не отвечает. Как отредактировать это для быстрого запуска?

Если я напишу этот выбор, он будет работать быстро.

SELECT SUM(T.TOTALS_TO_DATE),R.ID 
    FROM Table2 T,Table1 R 
    WHERE T.ID= R.ID 
    AND T.TYPE = 'type5' 
    group by R.ID ; 

Это работает, но я не понимаю, почему сценарий обновления занимает 3000 секунд.

Спасибо.

ответ

2

пытаются использовать MERGE заявление

MERGE INTO table1 R using 
(SELECT SUM(T.TOTALS_TO_DATE) S, T.ID 
    FROM Table2 T 
    WHERE T.TYPE = 'type5' 
    group by T.ID 
) T 
ON (R.ID = T.ID) 
WHEN MATCHED THEN UPDATE SET R.TOTAL = T.S 
; 
+0

он работает быстро Я хочу, чтобы об этом работала правильно? спасибо за ответ – user1716182

+0

это то же самое с обновлением? так почему это так быстро :) Мне нужно знать, что это так же, как и скрипт обновления, я исследую записи. И слияние statament только для оракула? спасибо – user1716182

+0

@ user1716182 в статусе обновления подзапрос для вычисления суммы выполняется для строки earch (155.750 раз). В операторе MERGE подзапрос будет выполняться только один раз. – schurik

1

Вы забыли поместить условие where в сценарий обновления. Следовательно, он обновляет всю таблицу1 и, следовательно, требует времени.

Для запроса select вы упомянули предложение where, которое работает быстрее.

Edit: -

Проверьте наш этот link

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

  1. Удаление индекса в колонке, подлежащей обновлению.
  2. Выполнение обновления небольшими партиями.
  3. Отключение триггеров удаления.
  4. Замена оператора обновления операцией «Массовая вставка».
+0

Спасибо за ответ, но я поставил где пункт в сценарии обновления в запросе на выборку? как это изменить? – user1716182

+0

Вам нужно обновить все строки в столбце TOTAL вашей таблицы без каких-либо условий? –

+0

Да, я хочу обновить каждую строку, но когда я напишу select, она вернется через 1 секунду со всеми данными. – user1716182

Смежные вопросы