优化器未使用索引

时间:2019-03-09 22:27:56

标签: oracle11g database-performance

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

问题:尽管TABLE_3和TABLE_4上有复合索引,优化器仍未使用索引。

说明:

TABLE_4创建了以下唯一索引:

CREATE UNIQUE INDEX DB.CMCX_LTLT_PRIMARY ON DB.TABLE_4 
(LTLT_PFX, ACAC_ACC_NO)

TABLE_3创建了以下唯一索引:

CREATE UNIQUE INDEX DB.CMCX_PDVC_PRIMARY ON DB.TABLE_3 
(PDPD_ID, PDVC_TIER, PDVC_TYPE, PDVC_EFF_DT, PDVC_SEQ_NO)

enter image description here

即使两个表都存在索引,优化器也会对两个表使用全表扫描。索引是多列索引,但列的顺序 符合SQL Server文档,优化器应使用索引。该查询目前需要40-50分钟的时间来运行。

NB:数据库DB由另一个团队拥有,该团队不会接受任何更改索引的请求。唯一的选择是调整查询或使用明确的提示来使用索引。

1 个答案:

答案 0 :(得分:1)

优化器类似于人工智能。它根据所拥有的信息做出决策。如果这些信息是准确的,最新的,则决策更有可能是 good

因此:您是否收集统计数据,并且定期进行统计吗? (如果您习惯了另一个术语(来自以前的Oracle数据库版本),那么问题将是“您分析索引了吗?”。)

如果统计信息正常,并且优化器使用全表扫描,那么请注意,全表扫描不是邪恶。在某些情况下,它产生的结果比索引为 with 的结果更好。如果要使用它,请应用适当的提示。通常会说-如果您不知道自己在做什么,请不要使用提示,因为这可能会使情况变得更糟。

因为,性能调整不是一个简单的任务-有很多关于它的书。如果那样简单,那么每个人都会高效地做到这一点。可悲的是,事实恰恰相反。如果需要,请在以下网址的OraFAQ论坛上查看性能调整粘性主题:http://www.orafaq.com/forum/t/84315/。人们已经为我们(人类)收集了一些提示,使这项任务变得更加简单。