Oracle:强制使用索引

Oracle:强制使用索引,oracle,indexing,Oracle,Indexing,我有两个索引: 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("

我有两个索引:

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不同时查看索引和make,然后再查看索引范围扫描。 我怎样才能强制这样做?

这是因为哈希联接不在联接谓词上使用索引


阅读本文了解所有详细信息:

这是因为哈希联接不在联接谓词上使用索引


阅读本文了解所有详细信息:

您引用的是索引中未包含的列,因此即使使用索引连接本身会更快,Oracle也必须检索其余列的所有表块

仅供参考:根据统计信息,您可能会在这两个查询中的第一个查询中获得所需的索引联接,因为它只能通过索引进行解析,而第二个查询必须转到表中

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;

您正在引用索引中未包含的列,因此即使使用索引连接本身会更快,Oracle也必须检索其余列的所有表块

仅供参考:根据统计信息,您可能会在这两个查询中的第一个查询中获得所需的索引联接,因为它只能通过索引进行解析,而第二个查询必须转到表中

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;

如果您有分区选项,那么考虑哈希分区连接列上的两个表。分区分区连接将大大减少内存需求和连接到磁盘溢出的可能性。

如果您有分区选项,则考虑哈希分区连接列上的两个表。分区连接将大大减少内存需求和连接溢出到磁盘的可能性