在我的存储数据模型中,我得到了以下关系:
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至500米的行。
我希望你明白我的观点。如果有什么不明确的话随便问一下
问候 托马斯
答案 0 :(得分:3)
通常在事实表上执行聚合,在这种情况下,不同的是没有实际意义。
在这里,您需要使用count(distinct)来计算ID的数量,但这就是数据仓库的用途。同样,您可能必须运行Sum(持续时间),或计数(不同的用户)或计数(不同的产品)。
我认为您没有设计问题,您只需要确保您的组有足够的可用内存,操作尽可能在没有基于磁盘的排序的情况下运行。通过V $ SQL_WORKAREA_ACTIVE监视大型查询,监视SGA和PGA缓存顾问程序,并在需要时调整内存分配。