甲骨文:强制使用索引
问题描述:
我这有两只指数:甲骨文:强制使用索引
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不显得既指数和品牌和索引范围扫描后,在。 我该如何强制这样做?
答
你引用未包含在索引中的列,所以即使加入本身将采用指数更快,甲骨文将反正要取回所有的表块为其余的列。
参考:根据统计数据你可能会得到索引加入你正在寻找与第一这两个查询,因为它可以只用指数来解决,而第二查询有去表。
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;
答
如果您有分区选项,则考虑对连接列上的两个表进行散列分区。甲分区连接将大大减少该溢出到磁盘的存储器要求和可能性。
简直不可思议:○我不能相信...... – Revious 2013-03-27 13:59:59