某些表的数据需要在我的系统中更新(或删除,插入)。 但我想知道哪些数据已更新,删除和插入。 所以在更改数据之前,我将以不同的模式备份表 就像这样:
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 ??)或临时表空间? 以及如何确保资源足以进行比较操作?
答案 0 :(得分:3)
减号确实是一项资源密集型任务。它需要读取两个表并进行排序以比较两个表。但是,Oracle拥有先进的技术来实现这一目标。如果不能这样做,它将不会加载内存中的两个表(SGA)。它将使用,是的临时空间进行排序。但我建议你试一试。只需运行查询,看看会发生什么。数据库不会受到影响,总之你可以停止执行语句。
您可以采取哪些措施来提高查询效果:
首先,如果您确定哪些列不会更改,请不要包含它们。 所以,最好写一下:
select a, b from t1
minus
select a, b from t2
比使用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。选择update_date大于进程开始的位置将显示更新的记录。但这取决于您如何改变数据库模型和etl代码。