【问题标题】:Compare two tables with minus operation in oracle在oracle中用减法比较两个表
【发布时间】:2013-11-24 09:49:06
【问题描述】:

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

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 将如何读取内存(PGA??)或临时表空间中的 700M 数据吗? 以及我应该如何确保资源足以进行比较操作?

【问题讨论】:

  • 如果您的表可能是 700 MB,那么您可能只更改一小部分行。可能有比您建议的机制更好的方法来处理此问题,尤其是因为您至少需要足够的磁盘空间来存储两个数据副本。但是,我不是 Oracle 专家,所以我不知道合适的术语是什么。 'Changed Data Capture' 可能是一个合适的搜索词。

标签: performance oracle resources compare


【解决方案1】:

Minus 确实是一项资源密集型任务。它需要读取两个表并进行排序以比较两个表。然而,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。选择 where updated_date 大于 start of process 将显示更新的记录。但这取决于您如何更改数据库模型和 etl 代码。

【讨论】:

  • 嗨@Florin。谢谢你的回答和建议。我想比较表格的原因是别人有时会做一些数据更新操作。但我不确定会改变什么或者什么都不会。我不知道只能用减法同时加载两个表。
猜你喜欢
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 2014-05-09
相关资源
最近更新 更多