Oracle11g 优化器未使用索引

Oracle11g 优化器未使用索引,oracle11g,database-performance,Oracle11g,Database Performance,问题:优化器没有使用索引,尽管表3和表4上有一个复合索引 说明: 表4创建了以下唯一索引: SELECT DISTINCT LTLT.LTLT_PFX, LTLT.ACAC_ACC_NO, LTLT.LTLT_DESC, LTLT.LTLT_CAT, LTLT.LTLT_LEVEL, LTLT.LTLT_PERIOD_IND, LTLT.LTLT_RULE, LTLT.LTLT_IX_IND, LTLT.LTLT_IX_TYPE, LTLT.EXCD_ID, LTLT.L

问题:优化器没有使用索引,尽管表3和表4上有一个复合索引

说明:

表4创建了以下唯一索引:

SELECT DISTINCT
    LTLT.LTLT_PFX, LTLT.ACAC_ACC_NO, LTLT.LTLT_DESC, LTLT.LTLT_CAT, LTLT.LTLT_LEVEL,
    LTLT.LTLT_PERIOD_IND, LTLT.LTLT_RULE, LTLT.LTLT_IX_IND, LTLT.LTLT_IX_TYPE, LTLT.EXCD_ID,
    LTLT.LTLT_AMT1, LTLT.LTLT_AMT2, LTLT.LTLT_OPTS, LTLT.LTLT_SAL_IND, LTLT.LTLT_DAYS, LTLT.WMDS_SEQ_NO,
    LTLT.LTLT_LOCK_TOKEN, LTLT.ATXR_SOURCE_ID, LTLT.SYS_LAST_UPD_DTM, LTLT.SYS_USUS_ID, LTLT.SYS_DBUSER_ID,
    LTLT.LTLT_EXCL_DED_IND_NVL
FROM AGP.TABLE_1 DISB_CLM
INNER JOIN TABLE_2 CLCL ON DISB_CLM.CLCL_ID = CLCL.CLCL_ID
INNER JOIN TABLE_3 PDVC ON PDVC.PDPD_ID = CLCL.PDPD_ID
INNER JOIN TABLE_4 LTLT ON LTLT.LTLT_PFX = PDVC.LTLT_PFX
CREATE UNIQUE INDEX DB.CMCX_LTLT_PRIMARY ON DB.TABLE_4 
(LTLT_PFX, ACAC_ACC_NO)
表3创建了以下唯一索引:

SELECT DISTINCT
    LTLT.LTLT_PFX, LTLT.ACAC_ACC_NO, LTLT.LTLT_DESC, LTLT.LTLT_CAT, LTLT.LTLT_LEVEL,
    LTLT.LTLT_PERIOD_IND, LTLT.LTLT_RULE, LTLT.LTLT_IX_IND, LTLT.LTLT_IX_TYPE, LTLT.EXCD_ID,
    LTLT.LTLT_AMT1, LTLT.LTLT_AMT2, LTLT.LTLT_OPTS, LTLT.LTLT_SAL_IND, LTLT.LTLT_DAYS, LTLT.WMDS_SEQ_NO,
    LTLT.LTLT_LOCK_TOKEN, LTLT.ATXR_SOURCE_ID, LTLT.SYS_LAST_UPD_DTM, LTLT.SYS_USUS_ID, LTLT.SYS_DBUSER_ID,
    LTLT.LTLT_EXCL_DED_IND_NVL
FROM AGP.TABLE_1 DISB_CLM
INNER JOIN TABLE_2 CLCL ON DISB_CLM.CLCL_ID = CLCL.CLCL_ID
INNER JOIN TABLE_3 PDVC ON PDVC.PDPD_ID = CLCL.PDPD_ID
INNER JOIN TABLE_4 LTLT ON LTLT.LTLT_PFX = PDVC.LTLT_PFX
CREATE UNIQUE INDEX DB.CMCX_LTLT_PRIMARY ON DB.TABLE_4 
(LTLT_PFX, ACAC_ACC_NO)
优化器对这两个表使用全表扫描,即使这两个表都存在索引。索引是多列索引,但列的顺序不同 与SQL Server文档一致,优化器应使用索引。查询目前需要40-50分钟才能运行


注意:数据库数据库由不同的团队拥有,他们不会接受任何修改索引的请求。唯一的选择是调整查询或使用显式提示来使用索引。

优化器类似于人工智能。它根据自己掌握的信息做出决策。如果这些信息是准确的、最新的,那么决策就更有可能是好的

因此:你收集统计数据了吗?你经常这样做吗?如果您习惯于使用以前Oracle数据库版本中的另一个术语,那么问题是您是否分析了索引

若统计数据正常,并且优化器使用完全表扫描,请注意,完全表扫描并不是坏事。在某些情况下,它会产生比使用索引的结果更好的结果。如果您想让它使用它,那么应用适当的提示。人们通常说,如果你不知道自己在做什么,不要使用暗示,因为这样可能会让事情变得更糟


因为,性能调优不是一项简单的任务——有很多关于它的书。如果它是那么容易,每个人都会做得很有效率。可悲的是,事实恰恰相反。如果您愿意,请查看OraFAQ论坛上的性能调整主题,此处:。人们收集了一些提示,让我们人类的任务变得更简单。

感谢编辑@James Z