优化器不使用索引

问题描述 投票:0回答:1
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分钟才能运行。

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

oracle11g database-performance
1个回答
1
投票

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

因此:你收集统计数据了吗?你经常这样做吗? (如果你习惯了另一个术语(来自以前的Oracle数据库版本),那么问题就是“你是否分析了索引?”)。

如果统计数据正常,并且优化程序使用全表扫描非数组,请注意全表扫描不是邪恶的。在某些情况下,它会产生比具有索引的结果更好的结果。如果要使用它,请应用适当的提示。通常会说 - 如果你不知道自己在做什么,不要使用提示,因为你可能会让事情变得更糟。

因为,性能调优不是一项简单的任务 - 有关于它的书籍。如果这很容易,每个人都会有效地做到这一点。可悲的是,事实恰恰相反。如果你愿意,可以看看OraFAQ论坛上的性能调优粘性主题,在这里:http://www.orafaq.com/forum/t/84315/。人们已经为我们(人类)收集了一些提示,使这项任务更加简单。

© www.soinside.com 2019 - 2024. All rights reserved.