问题 外键约束是否会影响Oracle中的查询转换?


我有这样的情况:

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);

现在 b.a_id 实际上是指外键引用 a.a_id,但它没有正式声明。显然,这应该是出于诚信原因。但是,外键约束是否也会改善一般情况下或特定情况下的连接性能?如果是,对于什么类型的查询转换?

是否有关于此主题的相关文档?

我正在使用Oracle 11g(11.2.0.2.0)


6100
2017-11-16 14:55


起源



答案:


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

Tom Kyte有一个演讲 元数据很重要 讨论了各种类型的约束以及其他元数据如何影响优化器。


13
2017-11-16 15:42



我确信我以前读过这样的东西。无论如何,这似乎很明显。感谢您的回答和链接! - Lukas Eder
链接断开,我想演示文稿是这样的: docslide.us/documents/metadata-matters-by-tom-kyte-oracle.html - gaps96


答案:


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

Tom Kyte有一个演讲 元数据很重要 讨论了各种类型的约束以及其他元数据如何影响优化器。


13
2017-11-16 15:42



我确信我以前读过这样的东西。无论如何,这似乎很明显。感谢您的回答和链接! - Lukas Eder
链接断开,我想演示文稿是这样的: docslide.us/documents/metadata-matters-by-tom-kyte-oracle.html - gaps96


贾斯汀 已经指出,JOIN消除是一种基于非成本的基本SQL转换,可以仅基于元数据的存在来应用。我最近在博客上写过这篇文章:

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


1
2018-01-30 09:20