oracle - 事实表 - 选择不同的?

标签 oracle data-warehouse datamart

在我的存储数据模型中,我得到以下关系:

root_tbl -- 1:n -- entry_tbl -- n:1 -- action_tbl

还有一些表格,但这涵盖了基础知识。 好吧,基本上根表中的一个 ID 在条目表中有多个数据集。

示例数据:

root_tbl:

ID_root ; Country ; FK_User ; FK_Product
      1 ;      UK ;      23 ;      31
      2 ;      NL ;      42 ;      01


entry_tbl:

ID_entry ; FK_root ; FK_Action ; Duration
       1 ;       1 ;        42 ; 200ms
       2 ;       1 ;        10 ; 94ms
       3 ;       1 ;         9 ; 300ms
       4 ;       2 ;        10 ; 322ms
       5 ;       2 ;        30 ; 100ms

到目前为止一切顺利......使用此数据模型,可以很容易地回答诸如有多少记录将“UK”作为国家/地区且操作为“10”等问题。 现在我想将这些数据放入事实表中,但我的问题是这三个表的关系。例如,我是否会使用entry_tbl 的记录作为事实,而不是每次计算国家/地区、用户或产品时都必须在 ID 上执行不同的选择。

事实表看起来或多或少像这样(只需将字符串想象为外键):

fact_tbl:

ID ; FK_Action ; Duration ; Country ; User ; Product
1  ;        42 ;    200ms ;      UK ;   23 ;      31
1  ;        10 ;     94ms ;      UK ;   23 ;      31
1  ;         9 ;    300ms ;      UK ;   23 ;      31
2  ;        10 ;    322ms ;      NL ;   42 ;      01
2  ;        30 ;    100ms ;      NL ;   42 ;      01

这意味着我会有很多冗余数据。

有什么办法可以解决这些问题吗?事实表将包含约 300 - 500m 行。

我希望你明白我的意思。如果有任何不清楚的地方,请随时询问

问候 托马斯

最佳答案

通常会对事实表执行聚合,在这种情况下,不同的值就没有意义了。

这里需要使用 count(distinct) 来统计 ID 的数量,但这就是数据仓库的用途。同样,您可能必须运行 Sum(持续时间)、count(不同用户)或 count(不同产品)。

我不认为你有设计问题,你只需要确保你有足够的可用内存来让你的group by操作尽可能地运行而不需要基于磁盘的排序。通过 V$SQL_WORKAREA_ACTIVE 监视大型查询,监视 SGA 和 PGA 缓存顾问程序,并根据需要调整内存分配。

关于oracle - 事实表 - 选择不同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19292245/

相关文章:

java - 通过Web界面在Java中执行动态sql和pl/sql

sql - Oracle:如何使 "group by"超过一个范围?

sql - SQL Server 2008 中用户定义的排名/分析函数

hadoop - 自动从 Csv 文件获取数据到 Data Lake 的最佳方法

data-warehouse - 在数据仓库设计中识别事实表

sql - 当查询返回多行时,Oracle extractValue 失败

oracle - PL/SQL 开发人员 : How to find variable references?

database-design - OLTP 应用程序上的业务报告

database - 数据沿袭和数据来源之间有什么区别?

linux - 监视文件夹中的文件事件