为什么扫描这个不相关的表?

时间:2009-08-12 21:02:41

标签: oracle

我有一个跨越两个表的查询

select count(*) from ingenium.empevt, ingenium.evt where empevt_evtfk = evt_pk

需要很长时间才能运行并试图找出我查看计划的原因

    Operation   Object Name Rows    Bytes   Cost    Object Node In/Out  PStart  PStop

SELECT STATEMENT Optimizer Mode=CHOOSE      634 K       75981                                
  HASH JOIN     634 K   180 M   75981                                
    HASH JOIN       845 K   234 M   8930                                 
      HASH JOIN     465 K   53 M    3118                                 
        NESTED LOOPS        620 K   15 M    1618                                 
          NESTED LOOPS      1   20      2                                
            TABLE ACCESS BY INDEX ROWID INGENIUM.USR    1   10      1                                
              INDEX UNIQUE SCAN INGENIUM.XAK1USR    1                                        
            TABLE ACCESS BY INDEX ROWID INGENIUM.USR    1   10      1                                
              INDEX UNIQUE SCAN INGENIUM.XAK1USR    1                                        
          INDEX RANGE SCAN  INGENIUM.SECUSREMP_USREMP   89 M    600 M   1616                                 
        TABLE ACCESS FULL   INGENIUM.TBLEMP 620 K   55 M    1150                                 
      TABLE ACCESS FULL INGENIUM.TBLEMPEVT  1 M 182 M   4000                                 
    TABLE ACCESS FULL   INGENIUM.SECUSREMP  89 M    600 M   27013 

我不喜欢的是INGENIUM.SECUSREMP_USREMP上的表访问已满,其中包含大量行。我不知道为什么它扫描该表,因为它不在查询中。 INGENIUM.SECUSREMP_USREMP有一个引用ingenium.emp.emp_pk的外键,但我不明白为什么这很重要。

是否有某种方法可以重写此查询,以便它不扫描看似无关的表?为什么它首先扫描该表?

1 个答案:

答案 0 :(得分:1)

据推测,empevt和evt都是观点,而不是表格?您的查询计划(仅)显示正在访问的这些表:

  • USR
  • TBLEMP
  • TBLEMPEVT
  • SECUSREMP

这些观点的定义是什么?当然,除非你看错了计划!