【问题标题】:Oracle schema optimization for 1 : 0..1 relationship针对 1 : 0..1 关系的 Oracle 架构优化
【发布时间】:2013-02-12 20:33:00
【问题描述】:

我有两个如下所示的表:

table A: FieldID NUMBER (PK), other non-relevant fields
table B: FieldID NUMBER (PK/FK), other non-relevant fields

表格映射为 1 : 0..1 关系。具体来说,在表 A 中插入新行后,在未来的某个时间点,表 B 将填充额外的数据。

这种设计最初优于唯一的扩展表,以便在任何地方都有不可为空的字段(因为无法预测何时填充数据的“B”部分)。

现在...从 A 和 B 中选择连接的性能非常糟糕。我们正在讨论两个表中的几十万行,但是简单的内部连接需要大量时间才能完成。

除了将字段从 B 移到 A 中(为了避免额外的“空”检查,我不想这样做),我还可以如何提高我的性能?

【问题讨论】:

  • 定义“糟糕”,特别是单PK查询还是FULL TABLE SCAN?
  • 你好,这是一个PK搜索。如果我(例如)从 A、B 中选择 *,其中 A.FieldID = B.FieldID 和 rownum
  • 请发布解释计划。 Tracing the query 也可能有助于理解为什么需要这么多时间。

标签: performance oracle query-optimization


【解决方案1】:

像这样加入:SELECT /*+GATHER_PLAN_STATISTICS*/ ... FROM .. WHERE ...; 然后,向我们展示以下输出:SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));

这将显示执行计划以及相关统计信息,在执行查询时估计和实际找到。

【讨论】:

  • 您好,感谢您的考虑。我无权使用此功能,但我会要求我的 dba 提供给我。
  • 希望你能明白。访问执行计划和此类基数反馈信息对于查询的性能分析至关重要。
  • @Andrea 告诉他一些来自互联网的随机人问你。 ;) 更严重的是,正如@DavidAlridge 所说,如果您想查明真正的问题,这是必不可少的。或者你可以在 sql*plus 中使用set autotrace,总比没有好,但你不会得到预期行和实际行之间的差异。
  • @Andrea - 或者,如果您的 DBA 不授予您访问权限,请告诉他们“没关系,您调整查询。毕竟,这是您的工作”。
【解决方案2】:

如果您对所有行的两个表进行等值连接,那么您应该从哈希连接中获得最佳性能。如果可以缓存较小的连接数据集,则成本仅略高于对两个表的完整扫描,这几乎是您可以获得的效率。

如果您只连接少量的行,那么哈希集群可能会有所帮助,因为它在物理上将两个表的行放在一起,并且对于少量的行来说连接非常有效。不利的一面是,对其中任何一个(尤其是较小的表)的完整扫描都会更加昂贵,插入也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多