开发者社区> 问答> 正文

ORACLE 中 这条UPDATE怎么写更高效?:报错

某表 T1 中有flags 这列,有30位,默认(000000000000000000000000000000),我现在需要将第24位刷成‘1’。除了下面这种写法,还有木有更高效的:
UPDATE T1 SET flags=substr(flags, 1, 23)||'1'||substr(flags, 25);
T1 表,大概有几千万的数据。我看这样写,COST太高,很慢,REGEXP_REPLACE 函数我也不太会用,不知道有木有比较高效的写法
请多指教~

展开
收起
kun坤 2020-06-09 12:11:26 502 0
1 条回答
写回答
取消 提交回答
  • 可以考虑下 BITAND , 将 flags 当作或转成  bit 位 来操作。

    ######如果全部是默认值的话可以考虑直接加一列,默认值24位为1 ,然后改名。######回复 @StormFour : 请培养一下自己的理解能力。######回复 @huan :风马牛不相及,弃主论次没有意义。完全不能解决楼主的问题。######回复 @StormFour : 我说的是用同样的方法,insert效率要高过update。######回复 @huan : 请问你是怎么更新第24位呢######回复 @StormFour : 错误,对于上千万甚至上亿的数据,insert 绝对比update 全表快。典型的以空间换时间。###### regexp_replace(flags,'(\d{23})\d(\d{17})','\11\2')
    没环境自己做个临时表测试一下 ######set flag =flag+100000 where substr(flag,24,1)=0

    2020-06-09 12:11:36
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_樊文凯_ORACLE数据库和应用异构迁移最佳实践 立即下载
PostgresChina2018_王帅_从Oracle到PostgreSQL的数据迁移 立即下载
Oracle云上最佳实践 立即下载

相关镜像