powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Изменение большого количества записей в одной таблице. Как сделать цикл...
25 сообщений из 30, страница 1 из 2
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853216
NotPanoc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Есть элементарный запрос, которым мы пользуемся для изменения не большого количества записей. До 10000 записей обрабатывает до десяти минут:

update itemlist
set is_lbl_prtd = 1 where is_lbl_prtd = 0
and cashprice >0

Но иногда записей больше 50000 и тогда запрос может работать и пол часа и час, базу столько держать нельзя. Подскажите пожалуйста как сделать цикл допустим на изменение по 10000 записей.
P.S. Я не админ БД, но очень интересно...
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853218
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bulk collect / forall
sample
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853229
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotPanocДо 10000 записей обрабатывает до десяти минут:

Не может быть. Что-то у вас реально неправильно. За десять минут можно проапдейтить
несколько миллионов записей на старом ноутбуке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853230
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дайте хотя бы кол-во строк в таблице и план запроса.
Без этого разговор беспредметный.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853231
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
NotPanocбазу столько держать нельзяDimitry SibiryakovНе может быть.очевидно же - блокировки...
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853232
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderNotPanocбазу столько держать нельзяDimitry SibiryakovНе может быть.очевидно же - блокировки...
Или отсутствие/негодность индекса.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853250
Stawros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Или триггеры с кучей логики на таблице.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853256
NotPanoc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так и есть. В БД куча джобов, тригеров, под разными схемами и т.д.
Мы запускаем скрипт из SQL Developer , админы БД работают в другой проге, возможно с этим связано. У меня не хватает знаний(
Буду читать учебники...
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853362
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНе может быть. Что-то у вас реально неправильно. За десять минут можно проапдейтить
несколько миллионов записей на старом ноутбуке.Как вариант, в таблице миллиард записей и запрос не попадает в индекс.
Нужен план запроса.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853385
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Synoptic,

Тогда бы и 10тыс и 50тыс отрабатывало бы примерно одинаково долго.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853390
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Это ж какие триггеры надо наваять, чтобы по 17 записей в секунду отрабатывало. Как бы то ни было, лучше не гадать
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853399
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender, в любом случае вводных слишком мало
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853400
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderТогда бы и 10тыс и 50тыс отрабатывало бы примерно одинаково долго.
Вероятность влететь в микрооткат на 50тыс выше, чем на 10 :)
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853404
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymous,

Это возможно безотносительно отсутствия индекса, но при этом снова возвращает к проблемам конкурентного доступа.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853422
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно было бы еще нафантазировать resumable.
xtenderТогда бы и 10тыс и 50тыс отрабатывало бы примерно одинаково долго.При большем количестве записей может не использоваться индекс или, наоборот, неудачно использоваться.
Только 10000 записей за 10 минут и 50000 за полчаса-час вполне линейная зависимость.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853431
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderЭто возможно безотносительно отсутствия индекса, но при этом снова возвращает к проблемам конкурентного доступа.
Это просто контраргумент к утверждению 21956668 .
Ну и для проявления в полный рост достаточно одной удачной короткой конкурентной транзакции.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853436
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

xtenderЭто возможно безотносительно отсутствия индекса, но при этом снова возвращает к проблемам конкурентного доступа.
Это возможно безотносительно наличия конкурентного доступа.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
SQL> create table t
  2  as
  3  select rownum c
  4    from xmltable('1 to 500000');

Table created.

SQL>
SQL> update /*+ monitor*/t
  2     set c = c + 1;

500000 rows updated.

SQL>
SQL> select dbms_sqltune.report_sql_monitor('f9dx3wufpykrz')
  2    from dual;

DBMS_SQLTUNE.REPORT_SQL_MONITOR('F9DX3WUFPYKRZ')
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Monitoring Report

SQL Text
------------------------------
update /*+ monitor*/t set c = c + 1

Global Information
------------------------------
 Status              :  DONE
 Instance ID         :  1
 Session             :  TC (84:53047)
 SQL ID              :  f9dx3wufpykrz
 SQL Execution ID    :  16777231
 Execution Started   :  08/23/2019 18:04:26
 First Refresh Time  :  08/23/2019 18:04:26
 Last Refresh Time   :  08/23/2019 18:05:18
 Duration            :  52s
 Module/Action       :  SQL*Plus/-
 Service             :  pdb
 Program             :  sqlplus@db-19-siha (TNS V1-V3)

Global Stats

===================================================================
| Elapsed |   Cpu   |    IO    |  Other   | Buffer | Read | Read  |
| Time(s) | Time(s) | Waits(s) | Waits(s) |  Gets  | Reqs | Bytes |
===================================================================
|      52 |    8.59 |     1.81 |       41 |     1M |   22 |   6MB |
===================================================================

SQL Plan Monitoring Details (Plan Hash Value=931696821)
==============================================================================================================================================================
| Id |      Operation       | Name |  Rows   | Cost |   Time    | Start  | Execs |   Rows   | Read | Read  | Activity |           Activity Detail            |
|    |                      |      | (Estim) |      | Active(s) | Active |       | (Actual) | Reqs | Bytes |   (%)    |             (# samples)              |

==============================================================================================================================================================
|  0 | UPDATE STATEMENT     |      |         |      |        51 |     +2 |     3 |        0 |      |       |    38.46 | enq: CR - block range reuse ckpt (9) |
|    |                      |      |         |      |           |        |       |          |      |       |          | reliable message (11)                |
|  1 |   UPDATE             | T    |         |      |        53 |     +0 |     3 |        0 |      |       |    57.69 | log buffer space (16)                |
|    |                      |      |         |      |           |        |       |          |      |       |          | log file switch completion (1)       |
|    |                      |      |         |      |           |        |       |          |      |       |          | Cpu (13)                             |
|  2 |    TABLE ACCESS FULL | T    |    500K |  217 |        51 |     +2 |     3 |       1M |   22 |   6MB |     3.85 | db file scattered read (2)           |
==============================================================================================================================================================


trace file:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
PARSING IN CURSOR #140490733870984 len=38 dep=0 uid=78 oct=6 lid=78 tim=965570210 hv=2640268031 ad='65b8eff0' sqlid='f9dx3wufpykrz'
update /*+ monitor*/t
   set c = c + 1
END OF STMT
-- skipped
EXEC #140490733870984:c=8588759,e=51711780,p=762,cr=7294,cu=1065328,mis=0,r=500000,dep=0,og=1,plh=931696821,tim=1017282021
STAT #140490733870984 id=1 cnt=0 pid=0 pos=1 obj=0 op='UPDATE  T (cr=7279 pr=749 pw=0 str=3 time=51655200 us)'
STAT #140490733870984 id=2 cnt=1007798 pid=1 pos=1 obj=24825 op='TABLE ACCESS FULL T (cr=1546 pr=762 pw=0 str=3 time=197360 us cost=217 size=2500000 card=500000)'


19.4.0.0.190716.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853450
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SeaGate,

Да, я в курсе, обычно это показывают на инсерте, тк там это легче повторить - и размер растёт значительно быстрее
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853764
Попробуйте так
Код: plsql
1.
2.
3.
4.
update itemlist
set is_lbl_prtd = 1 where is_lbl_prtd = 0
and cashprice >0
and rownum <= 1000
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853790
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

xtenderДа, я в курсе, обычно это показывают на инсерте, тк там это легче повторить - и размер растёт значительно быстрее
Мы, видимо, имеем в виду разные DML Restarts, т.к. приведенный DML Restart на UPDATE повторить таки проще, чем на INSERT.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853792
chidoriami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotPanoc,

как вариант (я прям предвижу кучу говна негатива в свой адрес, но реально так может быть быстрее, без теста на вашей базе не узнать)

создаем таблицу с записями, которые хотим изменить

Код: plsql
1.
2.
3.
4.
5.
create table tmp_itemlist as
select rowid rwd
  from itemlist 
 where is_lbl_prtd = 0
   and cashprice >0



такая таблица создастся быстро и не будет "держать базу"

а потом merge
(можно и update where rowid in (select rwd from tmp_itemlist), но я предпочитаю merge)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
merge into itemlist tgt
using (
    select rwd from tmp_itemlist src
)
 src
on (tgt.rowid = src.rwd)
when matched then
    update set 
                 tgt.is_lbl_prtd = 1
;



апдейт по rowid, имхо, самый быстрый вариант в случае, когда нельзя пересоздать таблицу

p.s. есть опасность, что админы в момент выполнения запроса будут что-то делать в базе, что повлияет на rowid (например, перемещать в другой tablespace)
по моему опыту, админы должны предупреждать о таких вещах рассылкой
если не предупреждают, ну, можно позвонить и спросить))))
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853801
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chidoriamiадмины в момент выполнения запроса будут что-то делать в базе, что повлияет на rowid"переместить" строку можно банальным dml.
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853807
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-chidoriamiадмины в момент выполнения запроса будут что-то делать в базе, что повлияет на rowid"переместить" строку можно банальным dml.
row movement - не единственная потенциальная проблема предложенного метода.
Но при выполнении ряда условий метод действительно позволяет "проскочить" statement restart.
При невыполнении этих условия метод способен устроить data inconsistency, но то такое, молодежь от природы оптимистична ;)
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853858
chidoriami
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

а какие еще проблемы у предложенного метода?
(мне для саморазвития и да, я оптимист))))
...
Рейтинг: 0 / 0
Изменение большого количества записей в одной таблице. Как сделать цикл...
    #39853870
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chidoriamiа какие еще проблемы у предложенного метода?
(мне для саморазвития и да, я оптимист))))

Логическая проблема: в исходной таблице могут существовать существуют inter-row dependencies, и между моментом формирования списка rowid и update состояние записей изменилось (а если поводом для велосипедостроения послужила конкуренция, то оно точно изменилось) => update (merge) может привести к нарушению целостности данных.
То же верно и без inter-row deps, если состояние атрибутов подопытной таблицы находится в функциональной зависимости от атрибутов иных таблиц.

Проблема здравого смысла: формирование списка rowid суть отбор тех самых строк, которые следует обновить. Есть очень мало причин не обновить строки сразу по факту нахождения, а записать их координаты для обновления отдельным процессом.

Проблема административно-техническая: вендор не рекомендует проектировать тех.процессы таким образом, чтобы сохранять rowid записей в таблицах БД.

Проблема этическая: тот, кто придет после Вас и увидит подобные решения, будет костерить Вас от всей своей широкой души и, заламывая руки, закатывая глаза и брызгая слюной, требовать "все переписать".
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Изменение большого количества записей в одной таблице. Как сделать цикл...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]