我们有一个审计数据库(oracle),其中保存由部署在应用程序服务器上的服务(大约100个)执行的所有活动的监视信息。正如您可以想象的那样,由于服务处理的请求量很大,审计数据库真的很大。在此数据库上发生的唯一写入事务是实时写入审计信息的服务。
随着审计数据库开始增长(每天超过一百万条记录),查询所需数据(例如select all errors occurred with service A for requests between start date and end date)很快变得几乎不可能。
为了解决这个问题,一些“聪明的孩子”决定设计一个批处理作业,将数据从数据库复制到另一个数据库(比如audit_archives),并删除记录,以便在审计数据库中只保留2天的审计数据。
这一开始看起来很简洁,但每当“批处理”进程运行时,将数据插入审计数据库的审计过程就会变得非常慢--有时“批处理”过程也会因为数据库争用而失败。
设计此场景的更好方法是以最有效的方式执行上面提到的存档,以便对审核过程和批处理的影响最小?
发布于 2012-03-01 04:54:03
您可能希望对基表进行分区。
创建一个镜像表(作为“历史”数据的目标),并在该表上创建相同的分区方案(很可能是基于每个日期)。
然后,您可以简单地将“旧”分区(使用ALTER TABLE the_table EXCHANGE partition)从一个表交换到另一个表。应该只需要几秒钟就可以“移动”分区。实际性能将取决于所定义的索引(本地、全局)。
这种技术通常被用来做相反的事情(在数据仓库环境中准备要输入到报告表中的新数据),但也应该用于“存档”。
发布于 2012-03-01 05:13:54
我很简单的方式。
II队列
使用FORALL statement
https://stackoverflow.com/questions/9506237
复制相似问题