1

某些表的数据需要在我的系统中更新(或删除、插入)。但我想知道哪些数据被更新、删除和插入。所以在数据改变之前,我会像这样备份不同模式的表:

create table backup_table as select * from schema1.testtable

并且在数据更改后,我想找到 backup_table 和 testtable 之间的差异,并且我想将差异保存到备份模式中的表中。

我将运行的 sql 是这样的:

 CREATE TABLE TEST_COMPARE_RESULT
 AS
 SELECT 'BEFORE' AS STATUS, T1.*
 FROM (
        SELECT * FROM backup_table
        MINUS
        SELECT * FROM schema1.testtable
 ) T1
 UNION ALL
 SELECT 'AFTER' AS STATUS, T2.*
 FROM (
        SELECT * FROM schema1.testtable
        MINUS
        SELECT * FROM backup_table
  ) T2

我担心的是我听说减号操作会占用大量系统资源。在我的系统中,某些表大小会超过700M。所以我想知道oracle如何读取内存中的700M数据(PGA ??) 还是临时表空间?以及我应该如何确保资源足以进行比较操作?

4

1 回答 1

4

减号确实是一项资源密集型任务。它需要读取两个表并进行排序以比较两个表。然而,Oracle 有先进的技术来做到这一点。如果做不到,它不会将两个表都加载到内存(SGA)中。是的,它将使用临时空间进行排序。但我建议你试一试。只需运行查询,看看会发生什么。数据库不会受到影响,您始终可以停止执行语句。

您可以做些什么来提高查询的性能:

首先,如果您有确定不会更改的列,请不要包含它们。所以,最好写:

select a, b from t1
minus 
select a, b from t2

比使用 a select * from t,如果多于这两列,因为工作量较小。

其次,如果要比较的数据量对您的系统来说真的很大(临时空间太小),您应该尝试在块上比较它们:

select a, b from t1 where col between val1 and val2
minus 
select a, b from t2 where col between val1 and val2 

当然,另一种可能性minus是拥有一些日志列,比如updated_date。选择 where updated_date 大于 start of process 将显示更新的记录。但这取决于您如何更改数据库模型和 etl 代码。

于 2013-02-25T06:54:03.500 回答