AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 119249
Accepted
Robotron
Robotron
Asked: 2015-10-27 14:11:51 +0800 CST2015-10-27 14:11:51 +0800 CST 2015-10-27 14:11:51 +0800 CST

使用 autotrace 附加提示

  • 772

我正在执行成功执行的直接路径插入。当我尝试自动跟踪执行时,我得到了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?
oracle oracle-12c
  • 1 1 个回答
  • 787 Views

1 个回答

  • Voted
  1. Best Answer
    Balazs Papp
    2015-10-28T13:40:52+08:002015-10-28T13:40:52+08:00

    对原始输出的回答:

    这不是由自动跟踪引起的。即使没有自动跟踪,您也会遇到同样的错误,只需重复相同的直接路径插入即可。在第一次插入后发出提交。

    这是记录在案的限制: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 启用 errorstack 跟踪来轻松确认这一点(对于这个简短的演示,在沙箱环境中没问题,但这不是我在真实数据库上执行此操作的方式):

    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
    
    • 3

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve