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

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

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

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

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

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

Это возможно безотносительно отсутствия индекса, но при этом снова возвращает к проблемам конкурентного доступа.
...
Рейтинг: 0 / 0
23.08.2019, 19:09
    #39853422
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение большого количества записей в одной таблице. Как сделать цикл...
Можно было бы еще нафантазировать resumable.
xtenderТогда бы и 10тыс и 50тыс отрабатывало бы примерно одинаково долго.При большем количестве записей может не использоваться индекс или, наоборот, неудачно использоваться.
Только 10000 записей за 10 минут и 50000 за полчаса-час вполне линейная зависимость.
...
Рейтинг: 0 / 0
23.08.2019, 19:52
    #39853431
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение большого количества записей в одной таблице. Как сделать цикл...
xtenderЭто возможно безотносительно отсутствия индекса, но при этом снова возвращает к проблемам конкурентного доступа.
Это просто контраргумент к утверждению 21956668 .
Ну и для проявления в полный рост достаточно одной удачной короткой конкурентной транзакции.
...
Рейтинг: 0 / 0
23.08.2019, 20:35
    #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
23.08.2019, 23:59
    #39853450
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение большого количества записей в одной таблице. Как сделать цикл...
SeaGate,

Да, я в курсе, обычно это показывают на инсерте, тк там это легче повторить - и размер растёт значительно быстрее
...
Рейтинг: 0 / 0
26.08.2019, 15:18
    #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
26.08.2019, 16:32
    #39853790
SeaGate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение большого количества записей в одной таблице. Как сделать цикл...
xtender,

xtenderДа, я в курсе, обычно это показывают на инсерте, тк там это легче повторить - и размер растёт значительно быстрее
Мы, видимо, имеем в виду разные DML Restarts, т.к. приведенный DML Restart на UPDATE повторить таки проще, чем на INSERT.
...
Рейтинг: 0 / 0
26.08.2019, 16:35
    #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
26.08.2019, 16:46
    #39853801
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение большого количества записей в одной таблице. Как сделать цикл...
chidoriamiадмины в момент выполнения запроса будут что-то делать в базе, что повлияет на rowid"переместить" строку можно банальным dml.
...
Рейтинг: 0 / 0
26.08.2019, 16:50
    #39853807
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение большого количества записей в одной таблице. Как сделать цикл...
-2-chidoriamiадмины в момент выполнения запроса будут что-то делать в базе, что повлияет на rowid"переместить" строку можно банальным dml.
row movement - не единственная потенциальная проблема предложенного метода.
Но при выполнении ряда условий метод действительно позволяет "проскочить" statement restart.
При невыполнении этих условия метод способен устроить data inconsistency, но то такое, молодежь от природы оптимистична ;)
...
Рейтинг: 0 / 0
26.08.2019, 18:34
    #39853858
chidoriami
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение большого количества записей в одной таблице. Как сделать цикл...
andrey_anonymous,

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

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

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

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

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


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