2016-12-17 3 views
1

Я создал одну таблицу разделов в Oracle 11g и попытался вставить записи, используя многопоточность из пакетного задания Java. Предположим, что если у меня есть 10 потоков, & каждый хочет вставить/обновить 1 миллион записей одновременно или навалом вставить некоторое время без потоков, в обоих случаях наша таблица была заблокирована оракулом для того же сеанса. Если у нас есть 10 потоков, мы получили 20 записей для 10 сеансов для одной таблицы. Это происходит только для раздела или раздела с таблицами подсетей.Таблица разделов блокируется для параллельных операций DML в Oracle

Ниже создать таблицу запроса

CREATE TABLE "SEG_TEST_SINGLE_PARTITION" 
(
"POR_CD" CHAR(2 CHAR) NOT NULL ENABLE, 
"PROD_MNTH" CHAR(6 CHAR) NOT NULL ENABLE, 
"INS_DTTM" TIMESTAMP (6) 
) 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE 
    (
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT 
) 
    TABLESPACE "a" PARTITION BY LIST 
    (
    "POR_CD" 
) 
    (
PARTITION "PWKLY_ORDR_POR01" VALUES 
(
    '01' 
) 
SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" , 
PARTITION "PWKLY_ORDR_POR02" VALUES 
(
    '02' 
) 
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" , 
PARTITION "PWKLY_ORDR_POR03" VALUES 
(
    '03' 
) 
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" , 
PARTITION "PWKLY_ORDR_POR06" VALUES 
(
    '06' 
) 
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" , 
PARTITION "PWKLY_ORDR_POR15" VALUES 
(
    '15' 
) 
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" , 
PARTITION "PWKLY_ORDR_POR20" VALUES 
(
    '20' 
) 
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" , 
PARTITION "PWKLY_ORDR_PORDF" VALUES 
(
    DEFAULT 
) 
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "a" 

);

К ниже запроса, я проверил таблицу блокировки

select a.INST_ID,a.XIDUSN,a.XIDSLOT,a.XIDSQN,a.OBJECT_ID,b.OBJECT_NAME,a.SESSION_ID,a.ORACLE_USERNAME,a.OS_USER_NAME,a.PROCESS,LOCKED_MODE from 
GV$LOCKED_OBJECT a,dba_objects b where a.object_id=b.object_id and  ORACLE_USERNAME like '%ASP01%' order by 8; 


    "INST_ID" "XIDUSN" "XIDSLOT" "XIDSQN" "OBJECT_ID" "OBJECT_NAME" "SESSION_ID" "ORACLE_USERNAME" "OS_USER_NAME" "PROCESS" "LOCKED_MODE" 
     3   58   16   424487  3235818 "PLAN_TABLE$"  2447    "ASP1"    "z013"   "15140"  3 

так как сейчас я не имею блокировку для выше созданной таблицы, теперь я побегу Вставить запрос без фиксации и проверки блокировки agian от SQL Developer (или из любой точки мира)

Insert into SEG_TEST_SINGLE_PARTITION (POR_CD,PROD_MNTH,INS_DTTM) values ('02','201607',to_timestamp('15-DEC-16 11.15.09.000000000 PM','DD-MON-RR HH.MI.SS.FF AM')); 
1 row inserted 

Блокировка запросов

select a.INST_ID,a.XIDUSN,a.XIDSLOT,a.XIDSQN,a.OBJECT_ID,b.OBJECT_NAME,a.SESSION_ID,a.ORACLE_USERNAME,a.OS_USER_NAME,a.PROCESS,LOCKED_MODE from 
GV$LOCKED_OBJECT a,dba_objects b where a.object_id=b.object_id and ORACLE_USERNAME like '%ASP01%' order by 8; 

результата с перегородкой таблица (SEG_TEST_SINGLE_PARTITON) в качестве имени объекта

"INST_ID" "XIDUSN" "XIDSLOT" "XIDSQN" "OBJECT_ID"  "OBJECT_NAME"     "SESSION_ID" "ORACLE_USERNAME" "OS_USER_NAME" "PROCESS" "LOCKED_MODE" 
    3  58   16  424487   3235818  "PLAN_TABLE$"      2447  "ASP01"     "z013"  "15140"   3 
    3  139   5  56366   3929061  "SEG_TEST_SINGLE_PARTITION"   3339  "ASP01"     "z013"  "31624"   3 
    3  139   5  56366   3929063  "SEG_TEST_SINGLE_PARTITION"   3339  "ASP01"     "z013"  "31624"   3 

Теперь мы хотели бы знать, почему мы получать tablelock для одной таблицы в два раза с таким же session_id (3339), который вызывает длительную задержку при вставке через Java многопоточность или налив вставить и несколько раз зависать на основе размера данных?

ответ

0

У нас была аналогичная проблема в нашем проекте. Мы увеличили INITRANS. Я не уверен, но старшая техническая арка сказала мне, что есть ошибка с оракулом 12c. Кроме того, MAXTRANS устарел. https://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses007.htm

Таким образом, мы вручную увеличили значение INITRANS для всех разделов, а затем moved разделов, чтобы эта настройка применима.

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

Я не уверен в точном синтаксисе, но это что-то вроде:

ALTER TABLE SEG_TEST_SINGLE_PARTITION MOVE PARTITION PWKLY_ORDR_POR02 INITRANS 10; 

ALTER TABLE SEG_TEST_SINGLE_PARTITION MODIFY PARTITION PWKLY_ORDR_POR02 REBUILD INDEX; 
+0

см Также это http://www.orafaq.com/forum/t/197448/ подобного объяснения тому, что я - пытаюсь рассказать. –

+0

Привет, Руж, я пробовал увеличивать initrans, но доцент работал для меня и все еще стоял перед блокировкой с той же session_id, которая ждет долгое время. Спасибо за ваш ценный ответ. –

Смежные вопросы