سؤال

أنا أقوم مباشرة-طريق إدراج الذي ينفذ بنجاح.عندما أحاول autotrace التنفيذ ، أحصل على 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 لديه درجة parallelism إلى 1 ، وفقا select table_name, degree from user_tables.لماذا أوراكل قوة موازية إدراج?
  2. لماذا استخدام autotrace trace السبب ORA-12838?
هل كانت مفيدة؟

المحلول

الجواب الأصلي الإخراج:

هذا ليس سببه autotrace.سوف تحصل على نفس الخطأ حتى من دون autotrace فقط من خلال تكرار نفس الطريق المباشر إدراج.يصدر بعد ارتكاب أول إدراج.

هذا هو تقييد الموثقة: ORA-12700 إلى ORA-19400

ORA-12838:لا يمكن قراءة/تعديل كائن بعد تعديل ذلك بالتوازي

السبب: ضمن نفس الصفقة, تم إجراء محاولة لإضافة قراءة أو تعديل البيانات في الجدول بعد تعديل موازية أو مباشرة تحميل.هذا غير مسموح به.

العمل:كتابة هذه الصفقة ، أو تقسيمها إلى اثنين من المعاملات:واحدة تحتوي على الأولي التعديل الثاني يحتوي على التوازي التعديل العملية.

الجواب على الانتاج الجديد بعد التعديل:

حسنا, لذلك عليك العودة و بدأت معاملة جديدة.في هذه الحالة ، autotrace حقا هو الجاني ، بشكل غير مباشر.القاعدة المذكورة أعلاه لا يزال ساريا ، حسب الوصف أعلاه يقول حتى قراءة المرجعية سوف يسبب الخطأ المذكورة أعلاه.إذا autotrace تمكين ذلك ضمنا يعمل شيء مثل هذا (بعد البيان الأصلي تم الانتهاء):

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

يمكنك بسهولة التأكد من هذا من خلال تمكين errorstack أثر عن الخطأ 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

وهذا ما يسبب خطأ, لأنه لا يزال نفس المعاملة.يمكنك اختبار ذلك حتى من دون autotrace:

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