【问题标题】:Do foreign key constraints influence query transformations in Oracle?外键约束会影响 Oracle 中的查询转换吗?
【发布时间】:2011-12-30 12:29:05
【问题描述】:

我有这样的情况:

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)

【问题讨论】:

    标签: performance oracle optimization sql-execution-plan cost-based-optimizer


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多