我有两个索引:
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在此之后不会同时查看索引和生成以及索引范围扫描。 我怎么强迫这样做?
答案 0 :(得分:3)
这是因为HASH连接不使用连接谓词上的索引。
阅读本文了解所有细节:http://use-the-index-luke.com/sql/join/hash-join-partial-objects
答案 1 :(得分:1)
您正在引用未包含在索引中的列,因此即使连接本身使用索引更快,Oracle仍然必须检索剩余列的所有表块。</ p>
供参考:根据统计信息,您可以使用这两个查询中的第一个查找索引连接,因为它只能使用索引进行解析,而第二个查询必须转到表中。
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;
答案 2 :(得分:1)
如果您有分区选项,则考虑对连接列上的两个表进行散列分区。分区连接将大大降低内存要求以及连接溢出到磁盘的可能性。