我有一个用户表,事务表和user_transaction表。用户数约为75,000个应用程序中可能存在的唯一事务数(事务表中的行数在1到3百万之间)。 user_transaction是上面两个表的连接,存储了哪些事务用户在什么日期和时间做了什么..所以这个表对于1年的数据将是巨大的(我们将从表中清除活动数据并在1之后存档它)年)。我们预计计数大约在5千万到6千万行。这将是年底的最终数据大小。
我想说平均大小约为3000万条记录。 此外,每夜导入作业更新所有这些表,这是在这些表中完成插入的唯一部分,我们只从我们的应用程序访问数据(使用选择查询)。
设计连接表以便更快地从巨大的事务表中进行检索的最佳方法是什么?我们在表中添加了许多字段来对其进行去规范化并减少连接,并且几乎所有数据都只在事务中可用user_transaction表。
如果我们想对表进行分区,我们该如何进行分区?该应用程序用于最频繁地查询更新的数据。
我们正在考虑按月划分交易表,以便每个月有1个表..
我们想到的其他选项是每周1天有7个表,但考虑到我们正在使用hibernate,这会大大增加查询的复杂性。
我们如何设计大约60百万的巨大桌子
按要求提供更多详细信息:
我将不得不从架构中制作一个图表,这里有更多信息同时发生:关系并不复杂,它大约有4个表:用户,事务,users_transaction,资源表。 user_transaction是包含所有其他三个表id的连接表,这是一个很大的连接表,因为它将在每个id上有单独的条目,并且还根据时间戳分开条目。
现在应用程序的用户数量非常少于< 20。 (但将来可能会增长)。
表格的主要消费者是:
1)每周自我审核报告作为电子邮件发送,其中包含过去一周中这些表的用户活动详细信息。这些将被发送(最终)到75,000个用户并生成报告并发送1个用户的电子邮件,目前大约需要1分钟(在试验阶段进行测试)。我们需要认真提高性能,每封电子邮件只需不到5秒钟。这是一个晚上运行的后端工作(应该最多消耗3-4个小时)
2)仪表板,其中包含显示这些表中事务的汇总视图的图表。这些查询基于日期范围中的各个字段运行和汇总数据。
因此,我们计划总结user_transactions表,如果所有其他字段相同(用户ID,资源ID,resource_eventid,位置),则存储每天的计数(不包括时间)。
并根据月份对这些汇总表进行分区。 (每月一个)
需要注意的是:解决方案应该适用于所有数据库(MySQL,DB2等...),而不仅仅是oracle。
此致 Priyank Devurkar
答案 0 :(得分:0)
好的,首先要做的事情。
...审计
Oracle具有非常强大的审核功能,因此在您尝试自己推送之前应先查看这些功能。
如果你真的想要自己推出,那么用户和交易之间存在一对多的关系。现在我在这里非常松散地使用术语事务,因为你似乎想要做的是记录用户X做某事来修改表格或表格中的行。
最简单的事情就是将所用的前端代码用于插入该表,例如:
插入审核表(userID,Operation)值('fred','udpated table payments并将某些列旧值更改为新值');
我会创建userID和时间戳的复合索引,以便可以在这两列作为单个实体查询。该表看起来像:
create table user_audit as
(
user_id number,
action_timestamp systimestamp,
db_action clob
)
CREATE INDEX idx_user_audit_ia ON user_audit (user_id,action_timstamp);
复合索引的效果是创建几乎两个键的哈希值,当你用这两个列进行查询时它们非常快。
这个单表对于删除和插入非常快。你可以通过以下方式加快速度:
没有FK回到用户表(这实在是毫无意义)。
如果您在数据库计算机上有足够的RAM,请将其设置为缓存缓冲区,但如果您有足够的RAM,则仅,或者您将服务器放入缓冲区。
如果您选择分区,只有在仔细阅读和了解在Oracle上进行分区后才选择方法。
确定确定您的表空间 BIG TABLE ,因为这样可以确保您不会超出大小限制(在linux上至少)单个文件。
至于您处理的其他数据库将有各自的调优问题,因此每个数据库都是一组一个关闭条件,适合一个数据库引擎而不是另一个数据库引擎。
在任何时候都要记住unix的座右铭,做一个的事情并做好。