甲骨文:强制使用索引

问题描述:

我这有两只指数:甲骨文:强制使用索引

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

这是因为HASH连接不使用连接谓词上的索引。

阅读本的所有细节:http://use-the-index-luke.com/sql/join/hash-join-partial-objects

+0

简直不可思议:○我不能相信...... – Revious 2013-03-27 13:59:59

你引用未包含在索引中的列,所以即使加入本身将采用指数更快,甲骨文将反正要取回所有的表块为其余的列。

参考:根据统计数据你可能会得到索引加入你正在寻找与第一这两个查询,因为它可以只用指数来解决,而第二查询有去表。

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; 

如果您有分区选项,则考虑对连接列上的两个表进行散列分区。甲分区连接将大大减少该溢出到磁盘的存储器要求和可能性。