2

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

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

到目前为止一切都很好......使用这个数据模型很容易回答诸如有多少记录将“英国”作为国家和行动“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 行。

我希望你明白我的意思。如果有什么不清楚的随时问

问候托马斯

4

1 回答 1

3

好吧,通常在事实表上执行聚合,在这种情况下,不同的将是没有意义的。

这里您需要使用 count(distinct) 来计算 ID 的数量,但这就是数据仓库的用途。同样,您可能必须运行 Sum(duration)、count(distinct user) 或 count(distinct product)。

我不认为你有设计问题,你只需要确保你的 group by 操作有足够的可用内存,以便在没有基于磁盘的排序的情况下尽可能运行。通过 V$SQL_WORKAREA_ACTIVE 监控大型查询,监控 SGA 和 PGA 缓存顾问,并在需要时调整内存分配。

于 2013-10-10T10:21:27.433 回答