Обновлять таблицу каждые 1000 строк - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь выполнить обновление определенной записи каждые 1000 строк, используя Postgres.Я ищу лучший способ сделать это.Моя функция описана ниже:

CREATE OR REPLACE FUNCTION update_row()
 RETURNS void AS
 $BODY$

 declare

 myUID integer;
 nRow integer;
 maxUid integer;

 BEGIN

 nRow:=1000;
 select max(uid_atm_inp) from tab into maxUid  where field1 = '1240200';

 loop
  if (nRow > 1000 and nRow < maxUid) then

  select uid from tab into myUID where field1 = '1240200' and uid >= nRow limit 1;

  update tab 
  set field = 'xxx'
  where field1 = '1240200' and uid = myUID;

  nRow:=nRow+1000;      
  end if;


 end loop;

 END; $BODY$
 LANGUAGE plpgsql VOLATILE

Как я могу улучшить эту процедуру?Я думаю, что-то не так.Цикл не заканчивается и занимает слишком много времени.

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

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

with t2 as (
  select
    uid, row_number() over (order by 1) as rn
  from tab
  where field1 = '1240200'
)
update tab t1
set field = 'xxx'
from t2
where
  t1.uid = t2.uid and
  mod (t2.rn, 1000) = 0

В своем комментарии я предполагаю, что вы подразумеваете под «каждой 1000-й строкой», без какого-либо обозначенияКак определить, какой кортеж, какой номер строки.Это легко отредактировать, изменив критерий «упорядочить по».

Добавление второго предложения where в обновлении (t1.field1 = '1240200') не повредит, но может не понадобиться, если это вложенный цикл.

Это может быть условно похоже на то, что имеет в виду Лоренц.

0 голосов
/ 25 октября 2018

Я решил так:

declare

myUID integer;
nRow integer;
rowNum integer;
checkrow integer;
myString varchar(272);

cur_check_row cursor for select uid , row_number() over (order by 1) as rn, substr(fieldxx,1,244)
from table where field1 = '1240200' and uid >= 1000 ORDER BY uid;

BEGIN

open cur_check_row;
loop
fetch cur_check_row into myUID, rowNum, myString;
EXIT WHEN NOT FOUND;

select mod(rowNum, 1000) into checkrow;

if checkrow = 0 then

    update table
    set fieldxx= myString||'O'
    where uid in (myUID);

end if;

end loop;
close cur_check_row;
0 голосов
/ 24 октября 2018

Чтобы выполнить эту задачу в SQL, вы можете использовать оконную функцию row_number и обновлять только те строки, где число делится на 1000.

Ваш цикл не завершается, потому что нет EXIT или RETURN в нем.

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