暂无图片
Oracle中in可以走索引吗?
我来答
分享
暂无图片 匿名用户
Oracle中in可以走索引吗?

有个sql大概长这样,如图


看这个解释计划,应该是最后走了全表扫描?因为确实是要从这4个seccategory里取数据,那有啥办法可以优化吗?给seccategory加个索引会不会好点?

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
codeniu

在 Oracle 数据库中,IN 运算符通常可以走索引,但也有一些限制和条件。

当以下条件满足时,Oracle 可以使用索引来优化 IN 运算符的查询:

  1. 列上存在索引:被用作 IN 运算符中的列应该在表上具有索引,这样 Oracle 才能使用索引来执行查询。

  2. IN 列表值不宽泛:IN 运算符的值列表应该是有限且相对较小的,以避免索引扫描的效率下降。如果 IN 列表非常大,可能会导致索引失效,不再使用索引优化查询。

  3. 数据分布均匀:数据在 IN 列上的分布应该相对均匀,以确保索引的有效性。如果数据分布不均匀,可能会导致索引选择性低,无法有效利用索引。

需要注意的是,对于某些情况,Oracle 可能会选择使用其他优化策略而不是索引。例如,如果使用索引可能导致大量的随机访问,而全表扫描可能更高效,Oracle 可能会选择全表扫描来执行查询。

综上所述,IN 运算符在 Oracle 中通常可以走索引,但需要满足索引存在、IN 列表值不宽泛和数据分布均匀等条件。具体的查询执行计划和性能会受到表结构、数据分布和查询条件等因素的影响。在实际使用中,可以通过观察查询执行计划和进行性能测试来评估使用索引的效果。

暂无图片 评论
暂无图片 有用 1
打赏 0
Thomas

给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
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
Oracle数据库更新或者删除表时必须指定where子句吗?
回答 2
已采纳
如果省略where子句,则update或delete将被应用到表中所有的行。因此,除非确实打算更新或者删除所有记录,否则要注意使用不带where子句的update或delete语句。建议在对表进行更新
加索引会对数据库造成什么影响,要加索引的表正在进行ogg同步
回答 3
1、不影响ogg的同步复制。2、加索引建议业务低峰实施,如果表有大量的dml,可能会出现会话堵塞。
Oracle排序后如何限制返回的行数?
回答 1
已采纳
12C之前只能使用rownum来限制返回行数。12C之后提出一个新的函数,通过偏移量来限制:原sql返回结果如下:SELECTFROMluciferORDERBYid;通过以下语句查询限制返回前三条:
AWR只有一个节点有报告
回答 4
一般查看mmon进程是否异常
Oracle RAC集群,服务器开启防火墙配置问题
回答 1
需要放通的IP有:1.OracleRAC用到的IP。包括PublicIP、VIP、PrivIP和ScanIP。2.链路本地IP。就是网卡上自动生成的169.254开头的IP。3.应用IP。包括需要访问
视图里面的生僻字如何显示?
回答 2
视图代码发一下
oracle数据库崩掉了,厂商说连接数大于1000就会崩,这个不太对吧?
回答 3
已采纳
showparameterprocess看下数据库设置的进程数是多少,如果是小于1000,那超过1000确实会崩。如果物理内存足够的话,可以增加process数量即可、altersystemsetpr
11在win上安装多个实例后自动启动端口监听失败,实例和Listener都需要重启,怎么破
回答 2
windowscmd可以使用下面命令查看端口占用进程:netstataon|findstr楼上大佬已经回答啦,同一个oracle版本的话,一个监听就够了。
ORACLE子表链接主表,主表的数据只显示在第一行怎么做到 像这种,子表链接主表,主表的数据只显示在第一行?
回答 1
看了三遍,确实没看懂需求描述
谁可以提供下ORACLE 11G的静态库libclntst11.a 或者告知哪里有下载? 官网找的都是动态库
回答 1
这个是做什么用的?
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~