Oracle:强制使用索引

Posted

技术标签:

【中文标题】Oracle:强制使用索引【英文标题】:Oracle: Forcing index usage 【发布时间】:2013-03-22 14:54:07 【问题描述】:

我有这两个索引:

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 在此之后不同时查看索引和进行索引范围扫描。 我怎么能强制这样做?

【问题讨论】:

【参考方案1】:

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

阅读本文了解所有详情:http://use-the-index-luke.com/sql/join/hash-join-partial-objects

【讨论】:

【参考方案2】:

您正在引用未包含在索引中的列,因此即使使用索引连接本身会更快,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;

【讨论】:

【参考方案3】:

如果您有分区选项,请考虑在连接列上对两个表进行哈希分区。分区连接将大大降低内存需求和连接溢出到磁盘的可能性。

【讨论】:

以上是关于Oracle:强制使用索引的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:强制使用索引

Oracle:在索引搜索上强制并行

oracle 中sql语句怎么加多个强制索引

ORACLE:强制喜欢使用索引? [重复]

oracle的SQL索引使用

oracle如何避免查询数据的时候索引失效