外键在索引中的用处(二)

在上一个问题:外键在索引中的用处(一)中,外键的消除表功能只能消掉一个,我们暂且理解为表中引用了非外键列之外的值,于是这次改为各表都只含一列,作实验如下:

SQL> DROP TABLE d;
Table dropped
SQL> DROP TABLE c;
Table dropped
SQL> DROP TABLE b;
Table dropped
SQL> DROP TABLE a;
Table dropped
SQL> create table a as select level as a1 from dual connect by level <=10;
Table created
SQL> alter table a add constraint pk_a primary key(a1);
Table altered
SQL> create table b as select a1 from a;
Table created
SQL> alter table b add constraint pk_b primary key(a1);
Table altered
SQL> alter table b add constraint fk_b foreign key(a1) references a(a1);
Table altered
SQL> create table c as select a1 from a;
Table created
SQL> alter table c add constraint pk_c primary key(a1);
Table altered
SQL> alter table c add constraint fk_c foreign key(a1) references b(a1);
Table altered
SQL> create table d as select a1 from a;
Table created
SQL> alter table d add constraint pk_d primary key(a1);
Table altered
SQL> alter table d add constraint fk_d foreign key(a1) references c(a1);
Table altered
SQL> explain plan for select d.a1 FROM d INNER JOIN c ON c.a1 = d.a1 inner join b on b.a1 = c.a1 inner join a on a.a1 = b.a1;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3346118423
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    10 |   260 |     1   (0)| 00:00:01 |
|   1 |  NESTED LOOPS      |      |    10 |   260 |     1   (0)| 00:00:01 |
|   2 |   INDEX FULL SCAN  | PK_D |    10 |   130 |     1   (0)| 00:00:01 |
|*  3 |   INDEX UNIQUE SCAN| PK_B |     1 |    13 |     0   (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("B"."A1"="D"."A1")
Note
-----
   - dynamic sampling used for this statement (level=2)
19 rows selected

SQL> 

形成了一个更有意思的plan,这儿消掉了表C与表A,而条件也直接变为了 3 - access("B"."A1"="D"."A1")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值