Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Паралельный DELETE  [new]
maverick2104
Member

Откуда:
Сообщений: 292
Добрый день ,

Есть таблица :
                 ID              NUMBER
                 FILE_NAME       VARCHAR2
                 FILE_CONTENT    BLOB
                 DATE_CREATED    DATE


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

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


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

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


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

Вот вторя сессия висит :
USERNAME	STATUS	PROGRAM	        ROW_WAIT_OBJ#	ROW_WAIT_FILE#	ROW_WAIT_ROW#	BLOCKING_SESSION_STATUS
ELECTRON_EXTR	ACTIVE	plsqldev.exe	100259	        0	        0	        VALID
5 апр 19, 11:04    [21853701]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5333
maverick2104
Разве оператор DELETE не ставит блокировку только на строках которые подтверждены изменению этим оператором ?

Почему deadlock?
5 апр 19, 12:46    [21853913]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
feagor
Member

Откуда: Москва
Сообщений: 162
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;
5 апр 19, 14:00    [21854021]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5333
redirect to TS...
feagor
maverick2104 ,

Попробуйте вариант
 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;
5 апр 19, 14:10    [21854036]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
maverick2104
Member

Откуда:
Сообщений: 292
feagor,
Viewer,

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

ID = PRIMARY KEY
Есть 4 индекса в таблице
Еще 2 Дочерние таблицы ( от ID )
5 апр 19, 14:33    [21854065]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
По ссылке-то сходил?
Уверен, что во всех блоках есть достаточно ITL-слотов или места для их создания?
Если нет, уменьшай степень параллелизма
5 апр 19, 14:40    [21854077]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
123йй
Member

Откуда:
Сообщений: 1501
maverick2104
Есть задача удалить старые записи ( поле BLOB содержит .pdf и занимает много места ) .

Просто удаление не освободит место.
5 апр 19, 14:41    [21854079]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
feagor
Member

Откуда: Москва
Сообщений: 162
maverick2104,

Сколько записей в таблице всего?
Сколько записей по trunc(date_created)?
Какая в итоге стоит задча?
5 апр 19, 14:42    [21854080]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
j2k
Member

Откуда: Новосибирск
Сообщений: 540
maverick2104,
Вторичные ключи все проиндексированы?
5 апр 19, 14:42    [21854081]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
maverick2104
Member

Откуда:
Сообщений: 292
123йй
maverick2104
Есть задача удалить старые записи ( поле BLOB содержит .pdf и занимает много места ) .

Просто удаление не освободит место.


Знаю,
delete from table1 where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy');
alter table1 modify lob (file_content)(shrink space);
5 апр 19, 14:46    [21854085]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
maverick2104
Member

Откуда:
Сообщений: 292
feagor
maverick2104,

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


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


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


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

SQL> select count(*) from v$lock;

  COUNT(*)
----------
       239
5 апр 19, 15:10    [21854122]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
maverick2104
Member

Откуда:
Сообщений: 292
maverick2104
( визуализация в представление V$LOCK ) .


Извините , деза , иду дальше читать .
5 апр 19, 15:13    [21854124]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
maverick2104
maverick2104
( визуализация в представление V$LOCK ) .


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

Но вот выборка из V$LOCK для этих 2 сессий (параллельных) могла бы хоть что-то прояснить
5 апр 19, 15:27    [21854138]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
maverick2104
Member

Откуда:
Сообщений: 292
Вячеслав Любомудров,

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

+ v$lock
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
5 апр 19, 15:42    [21854160]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
j2k
Member

Откуда: Новосибирск
Сообщений: 540
j2k
maverick2104,
Вторичные ключи все проиндексированы?

?
5 апр 19, 15:46    [21854167]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
maverick2104
Member

Откуда:
Сообщений: 292
j2k
j2k
maverick2104,
Вторичные ключи все проиндексированы?

?


Да.
5 апр 19, 15:53    [21854184]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
Но блокировки показывают, что это не так
5 апр 19, 15:54    [21854187]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
maverick2104
Member

Откуда:
Сообщений: 292
Вячеслав Любомудров,
j2k,

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

У этой таблице есть 2 foreign key references ( оба по столбцу ID у которого есть индекс в рамках данной таблице ).
5 апр 19, 16:02    [21854206]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9399
maverick2104
Решил запускать удаление из под разных сессий за разные дни но первая сессия сразу заблокировала вторую ...
Почему так происходит ?


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

delete from table1 where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy')


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

SY.
5 апр 19, 16:40    [21854258]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
Не, там бы блокировка TX конкурировала
5 апр 19, 16:44    [21854260]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
j2k
Member

Откуда: Новосибирск
Сообщений: 540
maverick2104
Вячеслав Любомудров,
j2k,

У этой таблице есть 2 foreign key references ( оба по столбцу ID у которого есть индекс в рамках данной таблице ).

Теперь я вас не пойму, у вас 2 столбца 1 индекс? можете структуру таблицы привести?
5 апр 19, 16:48    [21854264]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
maverick2104
Member

Откуда:
Сообщений: 292
SY
maverick2104
Решил запускать удаление из под разных сессий за разные дни но первая сессия сразу заблокировала вторую ...
Почему так происходит ?


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

delete from table1 where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy')


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

SY.


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


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




j2k
можете структуру таблицы привести?

+ Структура
-- 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
  );
5 апр 19, 17:02    [21854280]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
Еще раз -- проверь, кто ссылается на эту таблицу
5 апр 19, 17:13    [21854287]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
j2k
Member

Откуда: Новосибирск
Сообщений: 540
Вот эти колонки все проиндексированы (судя по вашим словам их должно быть 2)?

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
5 апр 19, 17:20    [21854291]     Ответить | Цитировать Сообщить модератору
 Re: Паралельный DELETE  [new]
казинак
Member

Откуда:
Сообщений: 1249
SY
maverick2104
Решил запускать удаление из под разных сессий за разные дни но первая сессия сразу заблокировала вторую ...
Почему так происходит ?


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

delete from table1 where trunc(date_created) = to_date('01.02.2019','dd.mm.yyyy')


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

SY.


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

странно, что другие продолжают упорствовать в своих версиях
5 апр 19, 17:25    [21854296]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить