إلحاق تلميح مع autotrace
-
29-09-2020 - |
سؤال
أنا أقوم مباشرة-طريق إدراج الذي ينفذ بنجاح.عندما أحاول 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
الأسئلة:
- الجدول
emp_big
لديه درجة parallelism إلى 1 ، وفقاselect table_name, degree from user_tables
.لماذا أوراكل قوة موازية إدراج? - لماذا استخدام
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