gpt4 book ai didi

Oracle外键执行计划?

转载 作者:行者123 更新时间:2023-12-04 18:48:54 24 4
gpt4 key购买 nike

考虑以下(简单的)情况:

CREATE TABLE PARENT (
PARENT_ID INT PRIMARY KEY
);

CREATE TABLE CHILD (
CHILD_ID INT PRIMARY KEY,
PARENT_ID INT NOT NULL,
FOREIGN KEY (PARENT_ID) REFERENCES PARENT (PARENT_ID)
);
CHILD.PARENT_ID上没有索引,所以修改/删除 PARENT代价高昂(Oracle 需要对 CHILD 进行全表扫描以强制执行参照完整性)。然而,以下语句的执行计划......
DELETE FROM PARENT WHERE PARENT_ID = 1

...不显示表扫描(SYS_C0070229 是 PARENT.PARENT_ID 上的索引):

query plan

我知道有方法可以 see all unindexed FOREIGN KEYs ,但如果我可以“警告”查询执行计划本身的潜在问题(顺便说一句,MS SQL Server 和其他可能的数据库会这样做),那就更好了。

这在 Oracle 中可能吗?

如果这很重要,我正在使用 Oracle 10.2。

最佳答案

我已更改您的约束以添加“ON DELETE CASCADE”,否则 Oracle 将引发错误。(外键违规的默认值是删除限制)

我相信您的问题的答案是“否”,Oracle 不会就未编入索引的外键列向您发出警告。在实践中,大多数这样的列都被索引了,因为这是将父级连接到子级的方式。

如果您想向某人证明没有索引会导致锁定问题和升级(不太理想的事情),您可以简单地禁用表锁定并显示错误。

SQL> alter table child disable table lock;

Table altered.

SQL> delete from parent where parent_id = 10;
delete from parent where parent_id = 10
*
ERROR at line 1:
ORA-00069: cannot acquire lock -- table locks disabled for CHILD

而对于解释计划问题,正如其他人指出的那样,要从子表中删除的 sql 是递归 SQL,并没有显示在解释计划中。

如果您跟踪 session ,您将看到递归 SQL。
  1* alter session set SQL_TRACE = TRUE
SQL> /

Session altered.

SQL> delete from parent where parent_id = 10;

1 row deleted.

SQL> commit;

Commit complete.

SQL> alter session set SQL_TRACE=FALSe;

Session altered.

=====================
PARSING IN CURSOR #2 len=39 dep=0 uid=65 oct=7 lid=65 tim=763167901560 hv=3048246147 ad='3160891c'
delete from parent where parent_id = 10
END OF STMT
PARSE #2:c=0,e=61,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=763167901555
=====================
PARSING IN CURSOR #1 len=48 dep=1 uid=0 oct=7 lid=0 tim=763167976106 hv=2120075951 ad='26722c20'
delete from "RC"."CHILD" where "PARENT_ID" = :1
END OF STMT
PARSE #1:c=0,e=42,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=763167976100
EXEC #1:c=0,e=291,p=0,cr=7,cu=7,mis=0,r=2,dep=1,og=4,tim=763168080347
EXEC #2:c=0,e=130968,p=0,cr=8,cu=14,mis=0,r=1,dep=0,og=1,tim=763168091605
STAT #2 id=1 cnt=1 pid=0 pos=1 obj=0 op='DELETE PARENT (cr=8 pr=0 pw=0 time=130887 us)'
STAT #2 id=2 cnt=1 pid=1 pos=1 obj=58703 op='INDEX UNIQUE SCAN SYS_C006951 (cr=1 pr=0 pw=0 time=19 us)'
STAT #1 id=1 cnt=0 pid=0 pos=1 obj=0 op='DELETE CHILD (cr=7 pr=0 pw=0 time=233 us)'
STAT #1 id=2 cnt=2 pid=1 pos=1 obj=58704 op='TABLE ACCESS FULL CHILD (cr=7 pr=0 pw=0 time=76 us)'

有用的链接: http://www.oracle-base.com/articles/10g/SQLTrace10046TrcsessAndTkprof10g.php

关于Oracle外键执行计划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9301615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com