【问题标题】:Oracle 'pseduo-fact' viewOracle“伪事实”视图
【发布时间】:2011-05-13 12:58:46
【问题描述】:

假设:

  1. 我有许多由事实和外键(“维度”和“键值”类型)组成的表。例如,遇到:

ID - 主键

维度

  • LOCATION_ID
  • PATIENT_ID

键值对

  • TYPE_ID
  • STATUS_ID
  • PATIENT_CLASS_ID
  • DISPOSITION_ID
  • ...

事实

  • 入学日期
  • DISCHARGE_DATE
  • ...

    1. 我没有创建数据仓库的选项
    2. 我想简化报告的数据结构

我的方法是创建多个伪维度视图(基于 DEPARTMENT 和 LOCATION 表的“D_LOCATION”)和伪事实视图(基于 ENCOUNTER 表的“F_ENCOUNTER”)。在伪事实视图中,我会将键值表(例如 STATUS、PATIENT_CLASS)加入事实表以包含名称字段(例如 STATUS.NAME、PATIENT_CLASS.NAME)。

问题:

  • 如果查询从 F_ENCOUNTER 中选择所有字段的子集(即不是所有 key-value.name 字段),Oracle 10g 优化器是否足够聪明,可以排除一些键值表连接(即未包含在查询中的)?
  • 我可以做些什么来优化这个架构(索引除外)
  • 还有其他方法吗?

** 编辑 ** 目标(按重要性排序):

  • 降低查询复杂度;提高查询一致性;减少报告开发时间
  • 优化查询处理
  • 尽量减少管理员负担
  • 减少存储空间

【问题讨论】:

    标签: oracle optimization view oracle10g


    【解决方案1】:

    一个优化建议是不要使用键值对表。维度表的概念是每条记录都应包含有关该概念的所有信息,而无需加入规范化表 - 即将星型模式转换为雪花模式。

    虽然值可能会在维度表记录中重复,但它的优点是报告查询中的连接更少。以这种方式对表进行非规范化可能看起来违反直觉,但在性能至关重要的情况下,它通常是最好的解决方案。

    【讨论】:

    • 我认为一位同事称这是一个“垃圾”维度。它保留给基数低的字段。这当然是有道理的。不幸的是,这个客户对数据仓库没有胃口。我想我可以创建一个以这种方式对数据进行非规范化的视图,然后(每天)将其具体化。称之为 F_ENCOUNTER_JUNK。
    • 不,垃圾维度用于组合几个不需要自己的表的不同想法(它本身最终可以成为键值表)。它通常被命名为通用名称,例如 STANDARD_VALUES。您的 PATIENT 和 LOCATION 等维度本身就是合法的维度。
    【解决方案2】:
    • 我认为 Oracle 不会排除在视图中完成的任何连接,因为连接会影响返回的行数。 (当内连接无法匹配任何行时,会使整个结果集为空。)
    • 您的优化目标是什么?查询速度?查询简单?存储效率?如果您可以牺牲存储效率以获得更好的查询性能,那么将键值引用替换为值本身(TYPE_NAME 代替 TYPE_IDPATIENT_CLASS_NAME 代替 PATIENT_CLASS_ID 等)。
    • [编辑:] 如果无法修改原始架构,请考虑使用物化视图。它本质上会预先计算连接并存储结果集,以额外的存储空间和可能不新鲜的数据为代价,为您提供快速的查询时间。您可以通过指定适当的刷新策略来控制后者。请参阅http://en.wikipedia.org/wiki/Materialized_viewhttp://download.oracle.com/docs/cd/B10500_01/server.920/a96520/mv.htm 了解更多详情。

    【讨论】:

    • 我不明白你的第二点。我将如何在视图中“用值本身替换键值引用”?还是你建议一张桌子?
    • 我的意思是把ENCOUNTER表中的key-value id替换成实际的值,这样ENCOUNTER就会包含TYPE_NAME、PATIENT_CLASS_NAME等列,可能会增加存储需求表,但无需连接到键值表。
    • DBA 不太可能愿意这样做,因为有问题的表是供应商的标准表之一。我知道我可以创建一个自定义存储库,但我试图不增加 ETL 负担。
    • 好的 - 如果该选项有帮助,我在答案中添加了关于物化视图的想法。
    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多