Database design oracle中大型表的模式设计
我有一个用户表、事务表和用户\事务表。用户数约为75000应用程序中可能的唯一事务数约为(事务表中的行数在100万到300万之间)。 user_transaction是上面两个表的连接,存储用户在什么日期和时间执行的事务。。因此,对于1年的数据,这个表将是巨大的(我们将从表中清除活动数据,并在1年后将其存档)。我们预计总数将在5000-6000万行左右。这将是年底的最终数据大小 我想说平均大小大约是3000万条记录。 此外,每晚的导入作业都会更新所有这些表,这是在这些表中执行插入操作的唯一部分,我们仅从应用程序访问数据(使用选择查询) 设计联接表以更快地从庞大的事务表中检索的最佳方法是什么?我们在表中添加了许多字段以使其非规范化并减少联接,并且几乎所有数据都只在事务和用户事务表中可用 如果我们想对表进行分区,我们如何进行分区?该应用程序用于最频繁地查询最近的数据 我们考虑的是每月对事务表进行分区,这样每个月就有一个表 我们考虑的另一个选择是一周中有一天每个表有7个,但是考虑到我们使用的是hibernate,这大大增加了查询的复杂性 我们如何设计这张6000万左右的巨大桌子 根据要求提供更多详细信息:Database design oracle中大型表的模式设计,database-design,oracle11g,schema-design,Database Design,Oracle11g,Schema Design,我有一个用户表、事务表和用户\事务表。用户数约为75000应用程序中可能的唯一事务数约为(事务表中的行数在100万到300万之间)。 user_transaction是上面两个表的连接,存储用户在什么日期和时间执行的事务。。因此,对于1年的数据,这个表将是巨大的(我们将从表中清除活动数据,并在1年后将其存档)。我们预计总数将在5000-6000万行左右。这将是年底的最终数据大小 我想说平均大小大约是3000万条记录。 此外,每晚的导入作业都会更新所有这些表,这是在这些表中执行插入操作的唯一部分,
我将不得不从模式中绘制一个图表,同时这里有一些更多的信息:关系并不复杂,它大约有4个表:用户、事务、用户、事务、资源表。user_transaction是包含所有其他三个表id的联接表,这将是一个巨大的联接表,因为它在每个id上都有单独的条目,并且根据时间戳也有单独的条目
现在应用程序的用户数量非常少,不像Ok,所以首先要做的是
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返回到users表(这实际上是毫无意义的)
- 如果数据库计算机上有足够的ram,请将其设置为保留在缓存缓冲区上,但仅在有足够ram时设置,否则将把服务器放入存储箱中
- 如果您选择分区,请仅在仔细阅读并理解Oracle分区后选择方法
- 在定义表空间时,请确保表空间是大表,因为这样可以确保不会超出单个文件的大小限制(至少在linux上)
始终记住unix的座右铭,做一件事,把它做得好,好,所以先做第一件事
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);
复合索引的作用是几乎创建两个键的散列,当您按这两列进行查询时,它们的速度非常快
这个表的删除和插入速度非常快。您可以通过以下方式加快速度: