匿名用户Oracle中in可以走索引吗?
有个sql大概长这样,如图

看这个解释计划,应该是最后走了全表扫描?因为确实是要从这4个seccategory里取数据,那有啥办法可以优化吗?给seccategory加个索引会不会好点?
我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
墨值悬赏
匿名用户有个sql大概长这样,如图

看这个解释计划,应该是最后走了全表扫描?因为确实是要从这4个seccategory里取数据,那有啥办法可以优化吗?给seccategory加个索引会不会好点?
在 Oracle 数据库中,IN 运算符通常可以走索引,但也有一些限制和条件。
当以下条件满足时,Oracle 可以使用索引来优化 IN 运算符的查询:
列上存在索引:被用作 IN 运算符中的列应该在表上具有索引,这样 Oracle 才能使用索引来执行查询。
IN 列表值不宽泛:IN 运算符的值列表应该是有限且相对较小的,以避免索引扫描的效率下降。如果 IN 列表非常大,可能会导致索引失效,不再使用索引优化查询。
数据分布均匀:数据在 IN 列上的分布应该相对均匀,以确保索引的有效性。如果数据分布不均匀,可能会导致索引选择性低,无法有效利用索引。
需要注意的是,对于某些情况,Oracle 可能会选择使用其他优化策略而不是索引。例如,如果使用索引可能导致大量的随机访问,而全表扫描可能更高效,Oracle 可能会选择全表扫描来执行查询。
综上所述,IN 运算符在 Oracle 中通常可以走索引,但需要满足索引存在、IN 列表值不宽泛和数据分布均匀等条件。具体的查询执行计划和性能会受到表结构、数据分布和查询条件等因素的影响。在实际使用中,可以通过观察查询执行计划和进行性能测试来评估使用索引的效果。
评论
有用 1给seccategory加索引, seccatagory应该是int类型吧?然后where条件改为seccategory between 1 and 4, 这样应该会走INDEX RANGE SCAN然后再按ROWID回表。当然,考虑到select输出字段较多,尽管你加了索引,优化器还是有可能会选择走全表扫描,因为这样不用回表而是直接从原表一次性取字段。具体怎样,得加完索引再看执行计划。
另外,建议将SQL改为多表关联的方式,即:
select a.id,a.subcatagory,....., a.doccreaterid, b.doccretername, a.departmentid, c.departmentname...... a.doccode from
doccetail a,hrmresource b,hrmdeparment c where a.doccreaterid=b.id and a.deparmentid=c.id and a.seccatagory between 1 and 4;
评论
有用 0
墨值悬赏