我想知道这件事。假设我需要在数据仓库中存储多个度量与时间的数据:
t | x'
-------
1 | 20
2 | 50
3 | 30
t | x''
-------
3 | 23
4 | 56
6 | 28
依旧......
t | x''n
-------
5 | 35
6 | 92
7 | 23
如果我需要以尚未定义的方式构建一些构成以前数据的大型事实表,那么可以更高效(在任何意义上说),有一个存储所有内容的大表或者像我描述的那样拥有单独的表? / p>
t | x' | x''
----------------
1 | 20 |
2 | 50 |
3 | 30 | 23 ...
4 | | 56
5 | | 28
6 | |
7 | |
答案 0 :(得分:5)
如果您正在谈论拥有动态数量的列(即每次添加另一个x''n时添加新列),这实际上不是关系数据库的处理方式。将列添加到大型表是一种非常低效的操作。根据您的RBDMS,当您这样做时,它实际上可能会复制并重新创建整个表。动态创建新表的速度更快,但仍然不如插入关系数据库真正执行的行那样快。基本上我所说的是你希望你的数据库模式是静态的(或很少改变)。所有动态操作都应该纯粹基于行。
也许你真正想要的是一个像这样的表:
t | x | prime
---+----+------
1 | 20 | 1
2 | 50 | 1
3 | 30 | 1
3 | 28 | 2
4 | 56 | 2
6 | 28 | 2
5 | 35 | 3
6 | 92 | 3
7 | 23 | 3
确保在查询中WHERE
子句中显示的列上创建索引(或者根据您查询表的具体情况,可能会创建一些战略复合索引)。此外,最好将主键列作为每个表的第一列,因为如果需要更新或删除它们,它将为您提供各行的唯一句柄。为了简单起见,我在上面的示例中省略了主键。
答案 1 :(得分:3)
使用一个事实表。时间是事实表的维度。如果您显示的重叠,则意味着您需要另一个维度。
答案 2 :(得分:1)
您是否需要立即使用/显示所有结果?如果是这样的话,将它们全部集中在一起会更有效率,为此我会选择一张表: - )