Oracle-oracle数据库中,SQL中的update的条件是联合索引中的一个,能吃到索引吗?

Oracle-oracle数据库中,SQL中的update的条件是联合索引中的一个,能吃到索引吗?

想挽留 发布于 2017-09-08 字数 233 浏览 1167 回复 3

1.应用的是oracle数据库
2.需要批量更新(上万条数据)一张表(现有大致200W)的数据
3.该表现已有三个索引
4.批量更新的条件是三个索引中的某个联合索引的其中一个
5.由于新建索引不太现实,也会影响维护性能,所以。。。

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

虐人心 2017-10-21 3 楼

SQL条件之满足联合索引中的一个是不能使用联合索引的。
按照你的情况。
是不是先把这些更新的数据select出来,然后把update的SQL语句改成Insert。
然后再delete由原来的数据(根据select出来的主键删除),最后insert。这样效率应该会高点。。

PS:在delete之前,做好原始数据的备份。。

归属感 2017-10-10 2 楼

楼上的说的都很好, 不过漏了一种情况:index skip scan

当复合索引的 前缀列 的可能值范围 很小的时候,Oracle查询优化器可能会使用 index skip scan来查询非前缀列。

《Expert Oracle Database Architecture》 第二版,11章,FAQ case1 里给出了详细说明。里面的例子:

建索引在(性别,员工号),性别只有 男和女,员工号唯一。

select * from t where empno = 5;

Oracle查询优化器可能会考虑使用index skip scan,逻辑上可以转换为下面的查询

select * from t where GENDER='M' and empno = 5
UNION ALL
select * from t where GENDER='F' and empno = 5;

这样就可以使用联合索引了。

浮生未歇 2017-09-29 1 楼

SQL中的update的条件是联合索引中的一个是否能使用到索引?
这要看情况而定。

例如表Table(A,B,C)
你建立了联合索引INDEX(B,C)

如果你查询的时候过滤条件包含C但不包含B( 如只有 where C = '11111' )是用不了索引的

但过滤条件只要包含B ( 如 where B = '11111' ) 是可以走索引的

一句话走联合索引,要遵循“前缀性”

PS:如果你的Table记录数太少,又或者索引建得不合理,Oracle会根据CBO不走索引的。