Database design oracle中大型表的模式设计

Database design oracle中大型表的模式设计,database-design,oracle11g,schema-design,Database Design,Oracle11g,Schema Design,我有一个用户表、事务表和用户\事务表。用户数约为75000应用程序中可能的唯一事务数约为(事务表中的行数在100万到300万之间)。 user_transaction是上面两个表的连接,存储用户在什么日期和时间执行的事务。。因此,对于1年的数据,这个表将是巨大的(我们将从表中清除活动数据,并在1年后将其存档)。我们预计总数将在5000-6000万行左右。这将是年底的最终数据大小 我想说平均大小大约是3000万条记录。 此外,每晚的导入作业都会更新所有这些表,这是在这些表中执行插入操作的唯一部分,

我有一个用户表、事务表和用户\事务表。用户数约为75000应用程序中可能的唯一事务数约为(事务表中的行数在100万到300万之间)。 user_transaction是上面两个表的连接,存储用户在什么日期和时间执行的事务。。因此,对于1年的数据,这个表将是巨大的(我们将从表中清除活动数据,并在1年后将其存档)。我们预计总数将在5000-6000万行左右。这将是年底的最终数据大小

我想说平均大小大约是3000万条记录。 此外,每晚的导入作业都会更新所有这些表,这是在这些表中执行插入操作的唯一部分,我们仅从应用程序访问数据(使用选择查询)

设计联接表以更快地从庞大的事务表中检索的最佳方法是什么?我们在表中添加了许多字段以使其非规范化并减少联接,并且几乎所有数据都只在事务和用户事务表中可用

如果我们想对表进行分区,我们如何进行分区?该应用程序用于最频繁地查询最近的数据

我们考虑的是每月对事务表进行分区,这样每个月就有一个表

我们考虑的另一个选择是一周中有一天每个表有7个,但是考虑到我们使用的是hibernate,这大大增加了查询的复杂性

我们如何设计这张6000万左右的巨大桌子

根据要求提供更多详细信息:
我将不得不从模式中绘制一个图表,同时这里有一些更多的信息:关系并不复杂,它大约有4个表:用户、事务、用户、事务、资源表。user_transaction是包含所有其他三个表id的联接表,这将是一个巨大的联接表,因为它在每个id上都有单独的条目,并且根据时间戳也有单独的条目

现在应用程序的用户数量非常少,不像Ok,所以首先要做的是

  • 按照Oracle标准,一个有3000万行的表并不庞大
  • 说您有75000个用户意味着数据库没有管理您的用户登录,可能有一些角色正在处理数据库
  • 审计

    Oracle具有非常强大的审计功能,因此在您尝试使用自己的功能之前,应该先研究一下这些功能

    如果你真的想自己动手,那么在用户和事务之间存在着1-many关系。现在我在这里非常松散地使用术语transactions,因为您似乎想在用户X修改表或表中的行时进行记录

    最简单的方法是使用任何前端代码将插入内容插入到该表中,例如:

    在审计表(userID,Operation)中插入值('fred','udpated table payments,并将某些列的旧值更改为新值')

    我将创建一个userID和时间戳的复合索引,这样就可以作为单个实体在这两列上查询if。这张桌子看起来像:

    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上)

    至于您所处理的其余数据库,它们都有各自的调优问题,因此每个数据库都是一组一次性条件,适合一个DB引擎,而不是另一个


    始终记住unix的座右铭,做一件事,把它做得好,好,所以先做第一件事

  • 按照Oracle标准,一个有3000万行的表并不庞大
  • 说您有75000个用户意味着数据库没有管理您的用户登录,可能有一些角色正在处理数据库
  • 审计

    Oracle具有非常强大的审计功能,因此在您尝试使用自己的功能之前,应该先研究一下这些功能

    如果你真的想自己动手,那么在用户和事务之间存在着1-many关系。现在我在这里非常松散地使用术语transactions,因为您似乎想在用户X修改表或表中的行时进行记录

    最简单的方法是使用任何前端代码将插入内容插入到该表中,例如:

    在审计表(userID,Operation)中插入值('fred','udpated table payments,并将某些列的旧值更改为新值')

    我将创建一个userID和时间戳的复合索引,这样就可以作为单个实体在这两列上查询if。这张桌子看起来像:

    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);
    
    复合索引的作用是几乎创建两个键的散列,当您按这两列进行查询时,它们的速度非常快

    这个表的删除和插入速度非常快。您可以通过以下方式加快速度: