You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c中索引未被选用及加主键后生效的原因咨询

为什么初始查询未使用索引?
  • 成本优先的优化决策:你的查询是读取表中所有行的object_id、object_name、owner三列。Oracle优化器会对比全表扫描和全索引扫描的I/O成本:全表扫描是连续多块读取,I/O效率更高;而你的复合索引ix_t_name虽为覆盖索引,但全索引扫描是离散单块读取,当表数据量较大时,优化器判定全表扫描的整体成本更低,因此选择不走索引。
  • 统计信息不足:刚创建的表和索引未收集足够统计信息,优化器无法准确判断索引的选择性与扫描成本,会倾向于选择更稳妥的全表扫描。
  • 索引选择性未明确:初始表未对object_id加约束,优化器不知道object_id是否唯一,若判定其选择性不高,会进一步降低使用索引的优先级。
添加主键约束后查询使用索引的原因
  • 唯一索引自动创建:Oracle添加主键约束时,会自动生成基于object_id的唯一B树索引(若不存在同前缀的唯一索引)。该索引的选择性为100%,优化器会判定其扫描效率远高于全表扫描。
  • 统计信息更新:添加主键后,Oracle会自动更新表与索引的统计信息,优化器能准确评估出:覆盖索引ix_t_name(或新的主键索引)的总数据块数远小于表的数据块数,全索引扫描的I/O开销更低。
  • 优化器策略调整:主键明确了object_id是唯一键,优化器会优先选择索引扫描路径——即使是全量读取场景,唯一索引的扫描逻辑也更高效,能快速定位每一行数据,整体性能更优。

内容的提问来源于stack exchange,提问作者Zhangxin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:50:08