12

我有这样的情况:

create table a(
  a_id number(38) not null,
  constraint pk_a primary key (id)
);

create table b(
  a_id number(38) not null
);

create index b_a_id_index on b(a_id);

Nowb.a_id实际上是一个外键引用a.a_id,但它没有被正式声明为这样。显然,这应该是出于完整性的原因。但是外键约束在一般情况下还是在特定情况下也能提高连接性能?如果是,对于什么类型的查询转换?

有没有关于这个主题的相关文档?

我正在使用 Oracle 11g (11.2.0.2.0)

4

2 回答 2

15

是的,设置外键约束可以提高查询性能。当存在通常不可用的适当外键约束时,有各种对优化器开放的转换。例如,如果您要加入但仅从中A选择B数据B,则优化器可以消除A如果存在外键约束,则完全来自查询计划(当您有有用的视图加入的表比当前查询严格需要的更多表时,这种事情非常方便,因为您不必交换额外连接的性能成本与使用现有视图的代码重用相比)。当您在执行诸如使用查询重写之类的操作来重写查询以使用数据仓库/DSS 类型系统中的物化视图时,它们也会派上用场。

Tom Kyte 有一个Metadata Matters演示文稿,其中讨论了各种类型的约束以及其他元数据如何影响优化器。

于 2011-11-16T15:42:13.777 回答
2

正如Justin已经指出的,JOIN 消除是一种基本的非基于成本的 SQL 转换,它可以仅基于元数据的存在来应用。我最近在博客上写过这个:

正如我最初假设的那样,有很多 SQL 转换依赖于元数据,因此添加外键约束(和其他约束)肯定会以积极的方式影响性能。

于 2018-01-30T09:20:00.840 回答