首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >归档大型数据库(Oracle),而不影响向其中插入记录的进程

问归档大型数据库(Oracle),而不影响向其中插入记录的进程
EN

Stack Overflow用户
提问于 2012-03-01 04:37:56
回答 2查看 993关注 0票数 1

我们有一个审计数据库(oracle),其中保存由部署在应用程序服务器上的服务(大约100个)执行的所有活动的监视信息。正如您可以想象的那样,由于服务处理的请求量很大,审计数据库真的很大。在此数据库上发生的唯一写入事务是实时写入审计信息的服务。

随着审计数据库开始增长(每天超过一百万条记录),查询所需数据(例如select all errors occurred with service A for requests between start date and end date)很快变得几乎不可能。

为了解决这个问题,一些“聪明的孩子”决定设计一个批处理作业,将数据从数据库复制到另一个数据库(比如audit_archives),并删除记录,以便在审计数据库中只保留2天的审计数据。

这一开始看起来很简洁,但每当“批处理”进程运行时,将数据插入审计数据库的审计过程就会变得非常慢--有时“批处理”过程也会因为数据库争用而失败。

设计此场景的更好方法是以最有效的方式执行上面提到的存档,以便对审核过程和批处理的影响最小?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-01 04:54:03

您可能希望对基表进行分区。

创建一个镜像表(作为“历史”数据的目标),并在该表上创建相同的分区方案(很可能是基于每个日期)。

然后,您可以简单地将“旧”分区(使用ALTER TABLE the_table EXCHANGE partition)从一个表交换到另一个表。应该只需要几秒钟就可以“移动”分区。实际性能将取决于所定义的索引(本地、全局)。

这种技术通常被用来做相反的事情(在数据仓库环境中准备要输入到报告表中的新数据),但也应该用于“存档”。

票数 2
EN

Stack Overflow用户

发布于 2012-03-01 05:13:54

我很简单的方式。

  1. 部分删除旧记录最好使用FORALL语句
  2. 部分复制数据最好使用FORALL
  3. 根据星期几添加分区

II队列

使用FORALL statement

  • fill

  • with trigger on audit,在trigger use queue中部分删除旧记录效果最好,以避免long dml
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9506237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档