【问题标题】:Query joined partitioned tables查询连接的分区表
【发布时间】:2019-08-05 12:24:01
【问题描述】:

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

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')

【问题讨论】:

    标签: oracle performance partitioning


    【解决方案1】:

    有两种可能。

    1) 将条件移至 on 子句:

    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') 
    

    【讨论】:

      猜你喜欢
      • 2023-02-08
      • 2016-06-04
      • 2013-07-22
      • 2017-11-21
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      相关资源
      最近更新 更多