Oracle数据库中执行计划未使用虚拟列索引问题求助
问题解决建议
问题根源
你的CONTENT_HASH虚拟列是STANDARD_HASH函数返回的RAW类型,但执行计划的谓词显示Oracle自动对该列做了RAWTOHEX转换(RAWTOHEX("CONTENT_HASH")=:1)——这种对索引列施加的函数操作,导致基于原始RAW值创建的唯一索引无法被利用,只能触发全表扫描。
具体解决办法
1. 修正MERGE的ON条件(推荐)
将绑定变量:1从十六进制字符串转换为RAW类型,而非让索引列做转换。修改后的MERGE语句如下:
MERGE INTO CONTENT USING DUAL ON (CONTENT_HASH = HEXTORAW(:1)) WHEN NOT MATCHED THEN INSERT (CONTENT, METADATA) VALUES(:2, :3) WHEN MATCHED THEN UPDATE SET METADATA = :4
调整后,Oracle会直接用RAW类型的绑定变量与索引列匹配,CONTENT_HASH_IDX索引就能被正常调用,避免全表扫描。
2. 调整绑定变量类型
如果应用端可以修改,直接将:1以RAW类型传入(而非十六进制字符串)。此时原MERGE语句的CONTENT_HASH = :1就能直接匹配索引列,无需任何转换操作。
3. 验证效果
修改后执行EXPLAIN PLAN查看执行计划,若出现INDEX UNIQUE SCAN CONTENT_HASH_IDX的操作项,说明索引已被正确利用。
内容的提问来源于stack exchange,提问作者Sourcerer
相关产品推荐
相关产品推荐

