문제

성공적으로 실행되는 직접 경로 삽입을 수행하고 있습니다.실행을 자동 추적하려고 하면 ORA-12838: cannot read/modify an object after modifying it in parallel.

SQL> insert into emp_big select * from emp_big_temp;

411843 rows created.

Elapsed: 00:00:00.89

Execution Plan
----------------------------------------------------------
Plan hash value: 3203427748

-----------------------------------------------------------------------------------------
| Id  | Operation                | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |              |   357K|    45M|  1164   (1)| 00:00:14 |
|   1 |  LOAD TABLE CONVENTIONAL | EMP_BIG      |       |       |            |          |
|   2 |   TABLE ACCESS FULL      | EMP_BIG_TEMP |   357K|    45M|  1164   (1)| 00:00:14 |
-----------------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
         15  recursive calls
      31909  db block gets
      12829  consistent gets
          0  physical reads
   34685216  redo size
        845  bytes sent via SQL*Net to client
        802  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
     411843  rows processed

SQL> rollback;

Rollback complete.

Elapsed: 00:00:00.18
SQL>
SQL> insert /*+ append */ into emp_big select * from emp_big_temp;

411843 rows created.

Elapsed: 00:00:00.18

Execution Plan
----------------------------------------------------------
ERROR:
ORA-12838: cannot read/modify an object after modifying it in parallel


SP2-0612: Error generating AUTOTRACE EXPLAIN report

Statistics
----------------------------------------------------------
          0  recursive calls
       4438  db block gets
       4283  consistent gets
          0  physical reads
       7648  redo size
        829  bytes sent via SQL*Net to client
        816  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
     411843  rows processed

질문:

  1. 테이블 emp_big 다음과 같이 병렬도가 1로 설정되어 있습니다. select table_name, degree from user_tables.Oracle이 병렬 삽입을 강제하는 이유는 무엇입니까?
  2. 왜 사용합니까? autotrace trace 원인 ORA-12838?
도움이 되었습니까?

해결책

원래 출력에 대한 답변:

이는 자동 추적으로 인한 것이 아닙니다.자동 추적 없이도 동일한 직접 경로 삽입을 반복하면 동일한 오류가 발생합니다.첫 번째 삽입 후 커밋을 실행합니다.

이는 문서화된 제한사항입니다. ORA-12700 ~ ORA-19400

ORA-12838:병렬로 수정한 후에는 객체를 읽거나 수정할 수 없습니다.

원인: 동일한 거래 내에서, 병렬로 수정 된 후 테이블에 읽기 또는 수정 문을 추가하려는 시도가 이루어졌습니다. 또는 직접 부하.이는 허용되지 않습니다.

행동:거래를 다시 작성하거나 두 가지 거래로 분류하십시오.하나는 초기 수정을 포함하고, 두 번째는 병렬 변형 작업을 포함합니다.

편집 후 새 출력에 응답합니다.

좋아, 롤백이 있었고 새 트랜잭션을 시작했습니다.이 경우, autotrace가 간접적으로 원인이 됩니다.위의 규칙은 여전히 ​​적용되며 위의 설명에서 알 수 있듯이 읽기 참조라도 위의 오류가 발생합니다.자동 추적이 활성화되면 암시적으로 다음과 같이 실행됩니다(원래 명령문이 완료된 후).

EXPLAIN PLAN SET STATEMENT_ID='PLUSxxxxxx' FOR insert /*+ append */ into emp_big select * from emp_big_temp;

오류 12838에 대한 오류 스택 추적을 활성화하면 이를 쉽게 확인할 수 있습니다(이 짧은 데모의 샌드박스 환경에서는 문제가 없지만 실제 데이터베이스에서는 이 작업을 수행하는 방법이 아닙니다).

alter system set events '12838 trace name errorstack level 3';

지금 이것을 실행하면:

SQL> create table t1 as select * from dba_objects where 1=2;

Table created.

SQL> alter system set events '12838 trace name errorstack level 3';

System altered.

SQL> set autotrace on
SQL> insert /*+ append */ into t1 select * from dba_objects;

20079 rows created.


Execution Plan
----------------------------------------------------------
ERROR:
ORA-12838: cannot read/modify an object after modifying it in parallel

경고 로그에서 오류와 추적 파일을 찾을 수 있습니다.추적 파일에는 다음이 포함됩니다.

dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=3, mask=0x0)
----- Error Stack Dump -----
ORA-12838: cannot read/modify an object after modifying it in parallel
----- Current SQL Statement for this session (sql_id=5x12x8czsd3t9) -----
EXPLAIN PLAN SET STATEMENT_ID='PLUS730007' FOR insert /*+ append */ into t1 select * from dba_objects

그리고 그것이 여전히 동일한 거래이기 때문에 오류가 발생하는 원인입니다.자동 추적 없이도 테스트할 수 있습니다.

SQL> rollback;

Rollback complete.

SQL> set autotrace off
SQL> insert /*+ append */ into t1 select * from dba_objects;

20079 rows created.

SQL> explain plan for insert /*+ append */ into t1 select * from dba_objects;
explain plan for insert /*+ append */ into t1 select * from dba_objects
*
ERROR at line 1:
ORA-12838: cannot read/modify an object after modifying it in parallel


SQL> select count(*) from t1;
select count(*) from t1
                     *
ERROR at line 1:
ORA-12838: cannot read/modify an object after modifying it in parallel
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 dba.stackexchange
scroll top