2015-01-30 3 views
0

У меня есть запрос обновленияPaging обновление Oracle запрос

UPDATE tablename 
set column1 = 'value1', column2= 'value2', column3= 'value3' 
where column4 = 'value4 

Мне нужно заявление выше модифицируют для:

  1. фиксации каждые 5000 записей
  2. остановку после того, как в общей сложности 500000 строк есть был обновлен.

Возможно ли это в oracle11g? Как мы можем достичь этого?

Написал процедуру SQL:

DECLARE 
fromCount number(10) := 0; 
toCount  number(10) := 0; 
BEGIN 
    LOOP 
     toCount := fromCount + 5000; 

     UPDATE tablename 
    set column1 = 'value1', column2= 'value2', column3= 'value3' 
    where column4 = 'value4 AND ROWNUM > fromCount AND ROWNUM < toCount; 

     COMMIT; 

     IF toCount=500000 THEN 
      EXIT; 
     END IF; 
    END LOOP; 
END; 

Это берет более чем на 1 час, чтобы выполнить его. Как я могу улучшить его производительность?

+0

Используйте для этого хранимую процедуру. –

+5

Заявление является атомарным, оно должно либо полностью преуспеть, либо полностью потерпеть неудачу. Для одного оператора SQL не было бы смысла совершать каждые 5000 строк. Вы могли бы написать PL/SQL, который повторялся над строками, которые вы хотите обновить, и включал промежуточные коммиты, но это почти всегда ошибка. Это замедляет ваш процесс, что усложняет его работу, требует, чтобы вы выполняли много домашних операций, чтобы сделать процесс перезагруженным и т. Д. Почему вы хотите это сделать, а не просто позволить Oracle обновить все строки, которые вы хотите обновить одним выстрелом? –

+0

Что относительно концепции LIMIT и OFFSET? Можем ли мы использовать это для его достижения? Я не знаю много об этом – user1653773

ответ

0

Вы можете использовать 'и rownum < = 500000'. Но проблема в том, что вы не будете знать, какие записи обновляются, а какие нет.