2009-08-12 22 views
0

我有的穿越兩個表爲什麼要掃描這個不相關的表格?

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

想必都empevt和EVT有看法,並不表?您的查詢計劃顯示(只)被訪問這些表:

  • USR
  • TBLEMP
  • TBLEMPEVT
  • SECUSREMP

什麼是這些觀點的定義是什麼?除非你正在看錯計劃!

+0

EMP是一個視圖!我甚至沒有想到這一點。如果我去源表,它是快速起泡。非常感謝。 – stimms 2009-08-12 21:34:34

相關問題