Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Паралельный DELETE / 25 сообщений из 28, страница 1 из 2
05.04.2019, 11:04
    #39797070
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
Добрый день ,

Есть таблица :
Код: plsql
1.
2.
3.
4.
                 ID              NUMBER
                 FILE_NAME       VARCHAR2
                 FILE_CONTENT    BLOB
                 DATE_CREATED    DATE



Есть задача удалить старые записи ( поле BLOB содержит .pdf и занимает много места ) .

Удаляю по дате :
Код: plsql
1.
delete from table1 where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy')



Один день удаляется по ~15 минут ( 20-22 тысяч записей ) .

Решил запускать удаление из под разных сессий за разные дни но первая сессия сразу заблокировала вторую ...


Почему так происходит ? Разве оператор DELETE не ставит блокировку только на строках которые подтверждены изменению этим оператором ?

Вот вторя сессия висит :
Код: plsql
1.
2.
USERNAME	STATUS	PROGRAM	        ROW_WAIT_OBJ#	ROW_WAIT_FILE#	ROW_WAIT_ROW#	BLOCKING_SESSION_STATUS
ELECTRON_EXTR	ACTIVE	plsqldev.exe	100259	        0	        0	        VALID
...
Рейтинг: 0 / 0
05.04.2019, 12:46
    #39797198
Viewer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
maverick2104Разве оператор DELETE не ставит блокировку только на строках которые подтверждены изменению этим оператором ?
Почему deadlock?
...
Рейтинг: 0 / 0
05.04.2019, 14:00
    #39797271
feagor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
Viewer,

Попробуйте вариант
execute immediate 'alter session enable parallel dml';
delete /*+parallel(t,10) full(t)*/ table t where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy');
commit;
...
Рейтинг: 0 / 0
05.04.2019, 14:10
    #39797284
Viewer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
redirect to TS...
feagor maverick2104 ,

Попробуйте вариант
Код: plsql
1.
2.
3.
 execute immediate 'alter session enable parallel dml';
    delete /*+parallel(t,10) full(t)*/ table t where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy');
    commit;
...
Рейтинг: 0 / 0
05.04.2019, 14:33
    #39797303
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
feagor,
Viewer,

Спасибо за отзыв , к сожалению parallel dml не спас ситуацию .
Еще инфа про таблицу :

ID = PRIMARY KEY
Есть 4 индекса в таблице
Еще 2 Дочерние таблицы ( от ID )
...
Рейтинг: 0 / 0
05.04.2019, 14:40
    #39797309
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
По ссылке-то сходил?
Уверен, что во всех блоках есть достаточно ITL-слотов или места для их создания?
Если нет, уменьшай степень параллелизма
...
Рейтинг: 0 / 0
05.04.2019, 14:41
    #39797310
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
maverick2104Есть задача удалить старые записи ( поле BLOB содержит .pdf и занимает много места ) .
Просто удаление не освободит место.
...
Рейтинг: 0 / 0
05.04.2019, 14:42
    #39797311
feagor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
maverick2104,

Сколько записей в таблице всего?
Сколько записей по trunc(date_created)?
Какая в итоге стоит задча?
...
Рейтинг: 0 / 0
05.04.2019, 14:42
    #39797312
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
maverick2104,
Вторичные ключи все проиндексированы?
...
Рейтинг: 0 / 0
05.04.2019, 14:46
    #39797315
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
123ййmaverick2104Есть задача удалить старые записи ( поле BLOB содержит .pdf и занимает много места ) .
Просто удаление не освободит место.

Знаю,
Код: plsql
1.
2.
delete from table1 where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy');
alter table1 modify lob (file_content)(shrink space);
...
Рейтинг: 0 / 0
05.04.2019, 15:10
    #39797331
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
feagormaverick2104,

Сколько записей в таблице всего?
Сколько записей по trunc(date_created)?
Какая в итоге стоит задча?

1) ~ 700 000 записей
2) ~ 21 000 записей
3) Удалить записи где trunc(date_created) < trunc(sysdate) - 60


Вячеслав ЛюбомудровПо ссылке-то сходил?
Уверен, что во всех блоках есть достаточно ITL-слотов или места для их создания?
Если нет, уменьшай степень параллелизма

Конечно сходил , что такое ITL-слоты и v$lock узнал сегодня .
Как я понял есть 255 ITL-слотов ( визуализация в представление V$LOCK ) .

Код: plsql
1.
2.
3.
4.
5.
SQL> select count(*) from v$lock;

  COUNT(*)
----------
       239
...
Рейтинг: 0 / 0
05.04.2019, 15:13
    #39797333
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
maverick2104( визуализация в представление V$LOCK ) .


Извините , деза , иду дальше читать .
...
Рейтинг: 0 / 0
05.04.2019, 15:27
    #39797343
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
maverick2104maverick2104( визуализация в представление V$LOCK ) .


Извините , деза , иду дальше читать .не парься, я просто не тот код посмотрел
Если у тебя не проходит уже parallel 2 (а не 10, как я подумал), то вряд ли дело в этом.

Но вот выборка из V$LOCK для этих 2 сессий (параллельных) могла бы хоть что-то прояснить
...
Рейтинг: 0 / 0
05.04.2019, 15:42
    #39797359
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
Вячеслав Любомудров,

SID=260 Первый delete который работает нормально .
SID=295 Второй delete который виснет ( в v$session blocking_session_status='VALID )

v$lock
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
ADDR	                KADDR	                SID	TYPE	ID1	ID2	LMODE	REQUEST	CTIME	BLOCK	CON_ID
00007FACA1C9ACD0	00007FACA1C9AD40	260	TM	89978	0	3	0	301	0	0
00007FACA1C9ACD0	00007FACA1C9AD40	260	TM	100259	0	3	0	0	1	0
00000000876D8958	00000000876D89D8	260	AE	100	0	4	0	4303	0	0
000000007D6E5D58	000000007D6E5DE0	260	TX	131084	560939	6	0	128	0	0
00007FACA1C9ACD0	00007FACA1C9AD40	295	TM	100259	0	0	5	75	0	0
00007FACA1C9ACD0	00007FACA1C9AD40	295	TM	89978	0	3	0	75	0	0
00000000876DDF98	00000000876DE018	295	AE	100	0	4	0	107	0	0

...
Рейтинг: 0 / 0
05.04.2019, 15:46
    #39797365
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
j2kmaverick2104,
Вторичные ключи все проиндексированы?
?
...
Рейтинг: 0 / 0
05.04.2019, 15:53
    #39797380
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
j2kj2kmaverick2104,
Вторичные ключи все проиндексированы?
?

Да.
...
Рейтинг: 0 / 0
05.04.2019, 15:54
    #39797383
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
Но блокировки показывают, что это не так
...
Рейтинг: 0 / 0
05.04.2019, 16:02
    #39797398
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
Вячеслав Любомудров,
j2k,

Может я Вас не правильно понял .

У этой таблице есть 2 foreign key references ( оба по столбцу ID у которого есть индекс в рамках данной таблице ).
...
Рейтинг: 0 / 0
05.04.2019, 16:40
    #39797439
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
maverick2104Решил запускать удаление из под разных сессий за разные дни но первая сессия сразу заблокировала вторую ...
Почему так происходит ?

Ты что запустил:

Код: plsql
1.
delete from table1 where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy')



из нескольких сессий и спрашиваешь почему все кроме первой висят???

SY.
...
Рейтинг: 0 / 0
05.04.2019, 16:44
    #39797440
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
Не, там бы блокировка TX конкурировала
...
Рейтинг: 0 / 0
05.04.2019, 16:48
    #39797443
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
maverick2104Вячеслав Любомудров,
j2k,

У этой таблице есть 2 foreign key references ( оба по столбцу ID у которого есть индекс в рамках данной таблице ).
Теперь я вас не пойму, у вас 2 столбца 1 индекс? можете структуру таблицы привести?
...
Рейтинг: 0 / 0
05.04.2019, 17:02
    #39797455
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
SYmaverick2104Решил запускать удаление из под разных сессий за разные дни но первая сессия сразу заблокировала вторую ...
Почему так происходит ?

Ты что запустил:

Код: plsql
1.
delete from table1 where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy')



из нескольких сессий и спрашиваешь почему все кроме первой висят???

SY.

Да нет конечно , в одной сессии я запустил:
Код: plsql
1.
delete from table1 where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy')



А во второй :
Код: plsql
1.
delete from table1 where trunc(date_created) = to_date('02.02.2019','dd.mm.yyyy')





j2kможете структуру таблицы привести?
Структура
Код: 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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
-- Create table
create table ELECTRON_EXTR.GENERATED_STATEMENTS
(
  id           NUMBER(19) not null,
  account_appl VARCHAR2(10 CHAR),
  account_id   NUMBER(19),
  client_id    NUMBER(19),
  data         VARCHAR2(10 CHAR),
  file_content BLOB,
  file_name    VARCHAR2(100 CHAR),
  home_branch  VARCHAR2(10 CHAR),
  perioada     VARCHAR2(36 CHAR),
  reprezentant VARCHAR2(50 CHAR),
  reson        VARCHAR2(255 CHAR),
  status       VARCHAR2(36 CHAR),
  time_created DATE,
  time_sent    DATE,
  version      NUMBER(10) not null,
  arch_pass    VARCHAR2(255 CHAR)
)
tablespace ELECTRON_EXTR_DATA01
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate indexes 
create index ELECTRON_EXTR.GENERATED_STATEMENTS_IDX3 on ELECTRON_EXTR.GENERATED_STATEMENTS (CLIENT_ID, ACCOUNT_ID, PERIOADA)
  tablespace ELECTRON_EXTR_DATA01
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create index ELECTRON_EXTR.GEN_STATS_IDX1 on ELECTRON_EXTR.GENERATED_STATEMENTS (DATA, CLIENT_ID, ACCOUNT_ID)
  tablespace ELECTRON_EXTR_DATA01
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create index ELECTRON_EXTR.GEN_STATS_IDX2 on ELECTRON_EXTR.GENERATED_STATEMENTS (CLIENT_ID, ACCOUNT_ID, DATA)
  tablespace ELECTRON_EXTR_DATA01
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints 
alter table ELECTRON_EXTR.GENERATED_STATEMENTS
  add primary key (ID)
  using index 
  tablespace ELECTRON_EXTR_DATA01
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

...
Рейтинг: 0 / 0
05.04.2019, 17:13
    #39797460
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
Еще раз -- проверь, кто ссылается на эту таблицу
...
Рейтинг: 0 / 0
05.04.2019, 17:20
    #39797464
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
Вот эти колонки все проиндексированы (судя по вашим словам их должно быть 2)?

Код: plsql
1.
2.
3.
4.
select col2.table_name, col2.column_name, fk.* from dba_constraints fk 
inner join dba_cons_columns col on fk.R_CONSTRAINT_NAME=col.constraint_name and fk.R_OWNER=col.owner
inner join dba_cons_columns col2 on fk.CONSTRAINT_NAME=col2.constraint_name and fk.OWNER=col2.owner
where col.table_name='GENERATED_STATEMENTS' and fk.constraint_type='R' order by 1,2
...
Рейтинг: 0 / 0
05.04.2019, 17:25
    #39797467
казинак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Паралельный DELETE
SYmaverick2104Решил запускать удаление из под разных сессий за разные дни но первая сессия сразу заблокировала вторую ...
Почему так происходит ?

Ты что запустил:

Код: plsql
1.
delete from table1 where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy')



из нескольких сессий и спрашиваешь почему все кроме первой висят???

SY.

и тут пришол лесник и всех разогнал

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


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