【发布时间】:2015-08-03 08:43:17
【问题描述】:
我有一个很长的查询,但类似于这里的简短版本:
select * from table_a a
left join table_b b on
b.id = a.id and
b.name = 'CONSTANT';
id 和 name 在 table_b 上有 2 个索引,idx_id 的重复项较少,idx_name 的重复项很多。这是一个相当大的表(20M+ 记录)。 join 需要 10 分钟以上。
一个简单的解释计划显示连接部分使用了大量内存,它显示它使用name 的索引而不是id。
如何解决这个问题?如何强制使用idx_id 索引?
我正在考虑将b.name='CONSTANT' 放在 where 子句中,但这是一个左连接,where 将删除 table_a 中存在的所有记录。
更新了解释计划。抱歉无法粘贴整个计划。
用b.name='CONSTANT'解释计划:
评论b.name子句时说明计划:
【问题讨论】:
-
一个简单的解释计划显示了连接部分的大量内存使用,它表明它使用索引作为名称而不是 id。 那么,解释在哪里计划?
-
两个表的统计信息都是最新的吗?
-
没有完整的计划,这是浪费时间。
标签: sql oracle indexing query-performance