问题描述
我们最近从12.1的单个实例更改为在具有两个节点的RAC环境中运行的12.2版本。
Wa现在面临的问题是,PL/SQL过程比单个实例运行的时间长3倍。
我们的管理员已经确定每个语句都在同一时间执行。我们已经尝试直接连接到单个节点,希望该过程在单个实例上的行为类似,但事实并非如此。
第二个问题是,未经处理的程序 (它在过去3年中没有任何问题地工作) 会出现以下错误。
Caused by: java.sql.SQLException: ORA-20000: ORA-02297: Constraint (SCHEMA.SPIL_PK) kann nicht deaktiviert werden - Abhängigkeiten sind vorhanden: Fehlgeschlagen => ALTER TABLE SPIEL DISABLE CONSTRAINT SPIL_PK ORA-06512: in ".PR_CLEAR_DATABASE", Zeile 59 ORA-06512: in " .PR_CLEAR_DATABASE", Zeile 59 ORA-06512: in Zeile 1 复制
The procedure:
CREATE OR REPLACE PROCEDURE pr_CLEAR_DATABASE AS CURSOR lc_select_table IS SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME NOT IN ('SCHEMA_VERSION', 'KMS') AND TABLE_NAME NOT LIKE 'QRTZ_%' ORDER BY 1; CURSOR lc_enable_constraints IS SELECT CONSTRAINT_NAME, TABLE_NAME FROM USER_CONSTRAINTS WHERE STATUS = 'DISABLED' AND CONSTRAINT_TYPE IN ('P','R') AND TABLE_NAME NOT IN ('SCHEMA_VERSION') AND TABLE_NAME NOT LIKE 'QRTZ_%' ORDER BY R_CONSTRAINT_NAME DESC; CURSOR lc_disable_constraints IS SELECT CONSTRAINT_NAME, TABLE_NAME FROM USER_CONSTRAINTS WHERE STATUS = 'ENABLED' AND CONSTRAINT_TYPE IN ('P','R') AND TABLE_NAME NOT IN ('SCHEMA_VERSION') AND TABLE_NAME NOT LIKE 'QRTZ_%' ORDER BY R_CONSTRAINT_NAME ASC; lv_user VARCHAR2(128); lv_sql VARCHAR2(512); BEGIN SELECT USER INTO lv_user FROM DUAL; IF ((lv_user='SYSTEM') OR (lv_user='SYS')) THEN RETURN; END IF; EXECUTE IMMEDIATE 'PURGE RECYCLEBIN'; -- DISABLE table's constraints FOR lv_constraint IN lc_disable_constraints LOOP lv_sql := 'ALTER TABLE ' || lv_constraint.TABLE_NAME || ' DISABLE CONSTRAINT ' || lv_constraint.CONSTRAINT_NAME; BEGIN EXECUTE IMMEDIATE lv_sql ; EXCEPTION WHEN OTHERS THEN raise_application_error ( -20000, SQLERRM || ': Fehlgeschlagen => ' || lv_sql); END; END LOOP; -- TRUNCATE tables FOR lv_table IN lc_select_table LOOP --get table name lv_sql := 'TRUNCATE TABLE ' || lv_table.TABLE_NAME; BEGIN EXECUTE IMMEDIATE lv_sql ; EXCEPTION WHEN OTHERS THEN raise_application_error ( -20000, SQLERRM || ': Fehlgeschlagen => ' || lv_sql); END; END LOOP; -- ENABLE table's constraints FOR lv_constraint IN lc_enable_constraints LOOP lv_sql := 'ALTER TABLE ' || lv_constraint.TABLE_NAME || ' ENABLE CONSTRAINT ' || lv_constraint.CONSTRAINT_NAME; BEGIN EXECUTE IMMEDIATE lv_sql ; EXCEPTION WHEN OTHERS THEN raise_application_error ( -20000, SQLERRM || ': Fehlgeschlagen => ' || lv_sql); END; END LOOP; END; /复制
专家解答
当您尝试禁用具有指向它的启用FK的PK时,您会得到一个ORA-02297:
这意味着要么:
-迁移后有人添加了新的FK
-迁移期间更改的约束名称
您只是按名称对约束进行排序。所以你真的很幸运,这以前从未发生过。所以要么你需要先改变光标来获得FKs:
或仅选择PKs并使用级联选项:
当谈到性能变化时,我只能给出一个答案:
跟踪你的会话,看看它在做什么!
理想情况下,在原始系统上执行相同的操作,以便您可以看到需要更长时间的时间。
其他任何事情都是疯狂的猜测 (=> 可能是错误的)。有关如何执行此操作的详细信息,请参见:
https://blogs.oracle.com/sql/how-to-create-an-execution-plan#tkprof
如果您正在努力解释结果,请发布您的发现,我们将为您提供帮助。
create table t1 ( x int not null primary key ); create table t2 ( x int references t1 (x) ); alter table t1 modify primary key disable ; ORA-02297: cannot disable constraint (CHRIS.SYS_C0010760) - dependencies exist复制
这意味着要么:
-迁移后有人添加了新的FK
-迁移期间更改的约束名称
您只是按名称对约束进行排序。所以你真的很幸运,这以前从未发生过。所以要么你需要先改变光标来获得FKs:
ORDER BY CONSTRAINT_TYPE DESC, R_CONSTRAINT_NAME ASC复制
或仅选择PKs并使用级联选项:
alter table t1 modify primary key disable cascade; Table T1 altered. select status from user_constraints where constraint_type in ( 'P', 'R' ) and table_name like 'T_'; STATUS DISABLED DISABLED复制
当谈到性能变化时,我只能给出一个答案:
跟踪你的会话,看看它在做什么!
理想情况下,在原始系统上执行相同的操作,以便您可以看到需要更长时间的时间。
其他任何事情都是疯狂的猜测 (=> 可能是错误的)。有关如何执行此操作的详细信息,请参见:
https://blogs.oracle.com/sql/how-to-create-an-execution-plan#tkprof
如果您正在努力解释结果,请发布您的发现,我们将为您提供帮助。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。