查询联接的分区表

时间:2019-08-05 12:24:01

标签: oracle performance partitioning

我有2个分区表。我想离开他们,这意味着我想要表'A'中所有在特定日期的记录,以及表'B'中的数据(如果有任何匹配的记录(也在特定日期))。两个表都已分区,所以我在where子句中使用分区列(时间),但是在此查询中,当表'B'中没有任何匹配的记录时,条件'B.time'变为空并且表'A'的记录不会出现在结果中。 如果我不对表'B'使用时间条件,则它的执行计划将成为所有分区范围,并且性能较差。 我该如何编辑查询?

select *   from A    left outer join B SSRESP
    on A.ID = B.A_ID  where 

    A.time >= to_date('1396/09/26 00:00:00',
                                 'yyyy/mm/dd hh24:mi:ss',
                                 'NLS_CALENDAR=persian')    
   and A.time <= to_date('1396/10/27 11:00:00',
                                 'yyyy/mm/dd hh24:mi:ss',
                                 'NLS_CALENDAR=persian')
          and B.time >=
       to_date('1396/09/26 00:00:00',
               'yyyy/mm/dd hh24:mi:ss',
               'NLS_CALENDAR=persian')    
      and B.time <=
       to_date('1396/10/27 11:00:00',
               'yyyy/mm/dd hh24:mi:ss',
               'NLS_CALENDAR=persian')

1 个答案:

答案 0 :(得分:1)

有2种可能性。

1)将条件移至子句上

select *   
  from A    
  left outer join B
    on A.ID = B.A_ID      
   and B.time >= to_date('1396/09/26 00:00:00',
                         'yyyy/mm/dd hh24:mi:ss',
                         'NLS_CALENDAR=persian')    
   and B.time <= to_date('1396/10/27 11:00:00',
                         'yyyy/mm/dd hh24:mi:ss',
                         'NLS_CALENDAR=persian')  
where A.time >= to_date('1396/09/26 00:00:00',
                        'yyyy/mm/dd hh24:mi:ss',
                        'NLS_CALENDAR=persian')    
  and A.time <= to_date('1396/10/27 11:00:00',
                        'yyyy/mm/dd hh24:mi:ss',
                        'NLS_CALENDAR=persian')

2)在左联接之前过滤表:

select *   
  from A    
  left outer join 
    (SELECT * FROM B
      WHERE B.time >= to_date('1396/09/26 00:00:00',
                              'yyyy/mm/dd hh24:mi:ss',
                              'NLS_CALENDAR=persian')    
        and B.time <= to_date('1396/10/27 11:00:00',
                              'yyyy/mm/dd hh24:mi:ss',
                              'NLS_CALENDAR=persian')) AS B
    on A.ID = B.A_ID  
where A.time >= to_date('1396/09/26 00:00:00',
                        'yyyy/mm/dd hh24:mi:ss',
                        'NLS_CALENDAR=persian')    
  and A.time <= to_date('1396/10/27 11:00:00',
                        'yyyy/mm/dd hh24:mi:ss',
                        'NLS_CALENDAR=persian')