2013-03-22 76 views
0

我這有兩隻指數:甲骨文:強制使用索引

CREATE INDEX NETATEMP.CAMBI_MEM_ANIMALI_ELF_T2A ON NETATEMP.CAMBI_MEM_ANIMALI_ELF_T2 
(TELE_TESTATA_LETTURA_ID, ELF_DATA_FINE_FATTURAZIONE) 

CREATE INDEX NETATEMP.LET_TESTATE_LETTURE1A ON NETATEMP.LET_TESTATE_LETTURE1 
(TELE_STORICO_ID, TRUNC("TELE_DATA_LETTURA")) 


CREATE TABLE NETATEMP.cambi_mem_animali_elf 
AS 
    SELECT --/*+ parallel(forn 32) */ 
      DISTINCT 
      forn_fornitura_id, 
      TRUNC (tele.TELE_DATA_LETTURA) TELE_DATA_LETTURA, 
      forn.edw_partition, 
      DECODE (SUBSTR (forn.TELE_TESTATA_LETTURA_ID, 1, 1), '*', 'MIGRATO', 'INTEGRA') Origine 
    FROM NETATEMP.cambi_mem_animali_elf_t2 forn, 
      netatemp.let_testate_letture1 tele 
      WHERE forn.tele_testata_lettura_id = tele.tele_storico_id 
      -- 
      AND forn.ELF_DATA_FINE_FATTURAZIONE != TRUNC (tele.TELE_DATA_LETTURA) 

它使用兩個全表掃描。我只是不明白爲什麼Oracle不顯得既指數和品牌和索引範圍掃描後,在。 我該如何強制這樣做? enter image description here

回答

1

你引用未包含在索引中的列,所以即使加入本身將採用指數更快,甲骨文將反正要取回所有的表塊爲其餘的列。

參考:根據統計數據你可能會得到索引加入你正在尋找與第一這兩個查詢,因爲它可以只用指數來解決,而第二查詢有去表。

select count(*) 
from netatemp.cambi_mem_animali_elf_t2 forn 
    ,netatemp.let_testate_letture1  tele 
where forn.tele_testata_lettura_id = tele.tele_storico_id; 


select count(*), min(forn.edw_partition) 
from netatemp.cambi_mem_animali_elf_t2 forn 
    ,netatemp.let_testate_letture1  tele 
where forn.tele_testata_lettura_id = tele.tele_storico_id; 
1

如果您有分區選項,則考慮對連接列上的兩個表進行散列分區。甲分區連接將大大減少該溢出到磁盤的存儲器要求和可能性。