我有这样的情况:
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)
是的,具有外键约束可以提高查询性能。当存在通常不可用的适当外键约束时,存在对优化器开放的各种变换。例如,如果你要加入 A
和 B
但只能从中选择数据 B
,优化器可以消除 A
完全来自查询计划,如果有一个外键约束(当你有了有用的视图加入更多的表而不是你当前的查询严格需要时,这种事情非常方便,因为你不需要交易使用现有视图对代码重用的额外连接的性能成本)。当您执行诸如查询重写之类的操作来重写查询以在数据仓库/ DSS类型系统中使用物化视图时,它们也会派上用场。
Tom Kyte有一个演讲 元数据很重要 讨论了各种类型的约束以及其他元数据如何影响优化器。
是的,具有外键约束可以提高查询性能。当存在通常不可用的适当外键约束时,存在对优化器开放的各种变换。例如,如果你要加入 A
和 B
但只能从中选择数据 B
,优化器可以消除 A
完全来自查询计划,如果有一个外键约束(当你有了有用的视图加入更多的表而不是你当前的查询严格需要时,这种事情非常方便,因为你不需要交易使用现有视图对代码重用的额外连接的性能成本)。当您执行诸如查询重写之类的操作来重写查询以在数据仓库/ DSS类型系统中使用物化视图时,它们也会派上用场。
Tom Kyte有一个演讲 元数据很重要 讨论了各种类型的约束以及其他元数据如何影响优化器。
如 贾斯汀 已经指出,JOIN消除是一种基于非成本的基本SQL转换,可以仅基于元数据的存在来应用。我最近在博客上写过这篇文章:
正如我最初假设的那样,有很多SQL转换依赖于元数据,因此添加外键约束(和其他约束)肯定会以积极的方式影响性能。