oracle sql语句自动转换/重写

oracle sql语句自动转换/重写,sql,database,oracle,oracle11g,rewrite,Sql,Database,Oracle,Oracle11g,Rewrite,我们有一个类似于ODS/MDM的参考数据数据库,但它是只读的。数据根据各种时间表从权威系统更新。每个表都维护历史数据-更新执行现有更新&插入新数据,删除执行现有更新 所有表格的格式如下: table <name> surrogate key, business key(s), attribute(s), effective_start_date, effective_end_date 然后我需要将此语句转换为: select A.busines

我们有一个类似于ODS/MDM的参考数据数据库,但它是只读的。数据根据各种时间表从权威系统更新。每个表都维护历史数据-更新执行现有更新&插入新数据,删除执行现有更新

所有表格的格式如下:

table <name> 
   surrogate key,
   business key(s),
   attribute(s),
   effective_start_date,
   effective_end_date
然后我需要将此语句转换为:

select
   A.busines_key,
   B.business_key,
   max( A.effective_start_date, B.effective_start_date ) effect_start_date,
   min( A.effective_end_date, B.effective_end_date ) effective_end_date
from
   A inner join B on (A.b_fk_col = B.business_key)
where
   (A.effective_start_date between B.effective_start_date and B.effective_end_date
   or
   A.effective_end_date between B.effective_start_date and B.effective_end_date)
实际上,我需要能够做的是在连接之后立即向查询计划添加一个步骤: e、 g

而不是原来的:

SELECT STATEMENT      
  MERGE JOIN CARTESIAN
    BUFFER SORT        
      TABLE ACCESS BY INDEX ID      A
        INDEX FULL SCAN             A_B_FK_IDX
    BUFFER SORT
      INDEX FULL SCAN               B_PK_IDX
我可以得到如下结果:

SELECT STATEMENT      
  ****  ADDED ****
  EFFECTIVE RANGES                     // create/modify where & select clauses
    TABLE ACCESS BY INDEX ID        A  // get the eff dates from A
    TABLE ACCESS BY INDEX ID        B  // get the eff dates from B
  ****************                     
    MERGE JOIN CARTESIAN
      BUFFER SORT        
        TABLE ACCESS BY INDEX ID        A
          INDEX FULL SCAN               A_B_FK_IDX
      BUFFER SORT
        INDEX FULL SCAN             B_PK_IDX

我该怎么做呢?谢谢。

我不太明白。您是否试图纠正性能问题?您似乎在描述分区。从这里开始:。这不是性能问题。它是关于确保针对历史数据的查询的数据完整性。例如,如果表A中有业务键“x”的记录,则需要动态SQL和/或ref游标。
SELECT STATEMENT      
  ****  ADDED ****
  EFFECTIVE RANGES                     // create/modify where & select clauses
    TABLE ACCESS BY INDEX ID        A  // get the eff dates from A
    TABLE ACCESS BY INDEX ID        B  // get the eff dates from B
  ****************                     
    MERGE JOIN CARTESIAN
      BUFFER SORT        
        TABLE ACCESS BY INDEX ID        A
          INDEX FULL SCAN               A_B_FK_IDX
      BUFFER SORT
        INDEX FULL SCAN             B_PK_IDX