AS (
                  
                  
                  SELECT cte.student_id 
                  
                  
                  FROM students cte
                  
                  
                  WHERE student_id > 41
                  
                  
                  ORDER BY cte.student_id ASC
                  
                  
                  LIMIT 10
                  
                  
                  )
                  
                  
                  UPDATE students st
                  
                  
                  SET modify_time = create_time + interval '1 second'
                  
                  
                  FROM cte
                  
                  
                  WHERE cte.student_id = st.student_id 
                  
                  
                  AND st.modify_time < st.create_time;
                  
                  
                  ROLLBACK;
                  
                  
                  END;
                  
                  
                  $$
                  
                  
                  -- students.student_id - primary key, 
                  
                  
                  -- по полям modify_time и create_time подходящих индексов нет.
                  
                  
                  
                  
                  
                  Вопрос: как проще всего с минимальным чтением узнать последний id из cte?
                  
                  
                  В дальнейшем я хочу сделать переменную, чтобы в цикле update'ить записи. И чтобы каждый update был в одной транзакции, так как не хочется надолго блочиить таблицу. Возможно даже некоторую паузу поставить между итерациями.
                  
                  
                
>опрос: как проще всего с минимальным чтением узнать последний id из cte? SELECT max(id) FROM cte >В дальнейшем я хочу сделать переменную, чтобы в цикле update'ить записи. Выглядит как отрезание хвоста по частям. Не, вообще подход с делением большых update на какие-то маленькие -- имеет право на жызнь. Но с переменными и по одной -- это ещё хужэ, чем какой-нибудь миллиард записей сразу переписать.
Не по одной) Я планировал найти оптимальное значение для limit в cte. Может быть будет 10 итераций, а может быть 100.
Главное -- не забудьте, что в РСУБД любая транзакцыя имеет право навернуться.
> Выглядит как отрезание хвоста по частям. Вот да, пример неудачный, не бывает так много студентов, что бы базу колом поставить.
магическое число 500, как и в оракле, не знаю с чем связано )
жуть конечно. а в чем смысл кода?
Обсуждают сегодня