Oracle的“伪事实”观点

时间:2011-05-13 12:58:46

标签: oracle optimization view oracle10g

假设:

  1. 我有许多由事实和外键组成的表('dimension'和'key-value'类型)。例如,ENCOUNTER:
  2. ID - 主键

    尺寸

    • LOCATION_ID
    • PATIENT_ID

    键值

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

    事实

    • ADMISSION_DATE
    • 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优化器是否足够智能以排除某些键值表连接(即未包含在查询中的那些?)
    • 我可以做些什么来优化这种架构(索引除外)
    • 还有其他方法吗?

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

  • 我不相信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