我的订购应用程序使用 Oracle 11g 数据库。这个数据库有一个主表 ORDERS 和多个子表,如 ORDER_DETAILS、PLAN 等。
ORDERS 表在 STATUS 列上进行 LIST 分区,所有其他表都使用 ORDERID 作为外键进行引用分区。
在负载高峰时,当订单状态发生变化并且 ORDERS 表行从一个分区移动到另一个分区时,Oracle 将对 ORDERS 表分区引用的所有子表执行行迁移。由于许多表依赖于 ORDERS 表,大量行移动发生导致子表之一出现死锁。
我的问题是,如何解决在ORACLE 的内部行迁移步骤中造成的死锁?
这是一个示例设置:
订单表:
CREATE TABLE ORDERS (
orderID NUMBER PRIMARY KEY,
description VARCHAR2(30),
status VARCHAR2(30))
PARTITION BY LIST (status) (
PARTITION A VALUES ('COMPLETED'),
PARTITION B VALUES ('ACTIVE'),
PARTITION C VALUES ('SUBMITTED'))
Run Code Online (Sandbox Code Playgroud)
子表:PLAN
CREATE TABLE PLAN (
planID NUMBER PRIMARY KEY,
orderID NUMBER,
description VARCHAR2(30),
CONSTRAINT FKC64393AD1EC7235 FOREIGN KEY (orderID)
REFERENCES ORDERS (orderID) ON DELETE …Run Code Online (Sandbox Code Playgroud) 我正在使用 Oracle 11g。
我需要删除分区并重建全局索引。下面的查询运行良好,但会阻塞表上的所有 DML 操作,直到重建索引。
ALTER TABLE ABC DROP PARTITION PART1 UPDATE GLOBAL INDEXES;
Run Code Online (Sandbox Code Playgroud)
但是,如果我将查询分成 2 部分并分别使用 ONLINE 选项重建索引,则在重建索引时 DML 查询不会被阻止
ALTER TABLE ABC DROP PARTITION PART1;
ALTER INDEX XYZ REBUILD ONLINE;
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是执行删除分区和重建索引之间的时间,这些索引将无法使用,可能会产生性能问题。
所以我的问题是,是否有任何选项可以在一个查询中删除分区并“在线”重建索引?目前我认为我们没有以下选择。
ALTER TABLE ABC DROP PARTITION PART1 UPDATE GLOBAL INDEXES ONLINE;
Run Code Online (Sandbox Code Playgroud)