对数据库大的表update的时候该怎么优化?

时间:2022-10-24 07:56:39
每张表大概有200万数据,现在要把中间几个属性在原来的基础上加2,直接用update 表名 set 属性值= 属性值+ 2   运行速度太慢了。有没有更加优化的方法?

9 个解决方案

#1


可以试下,create table as select...插入临时表,然后truncate原表,再插入回来 insert into...select...

#2


语句上没什么可以优化的地方,另外如果被更新的这几个字段上有索引的话,更新过程中会重建索引。可以先尝试一下分批更新,不行的话再考虑其他办法,比如快速游标之类的

#3


临时表插入原表中的记录,然后插入增加的属性值,然后用select sum() ..from ... group by ..

#4


引用 3 楼 nie544917623 的回复:
临时表插入原表中的记录,然后插入增加的属性值,然后用select sum() ..from ... group by ..


那增加的属性值里面如果有date类型怎么办?sum是不是不能对date对象进行操作?

#5


建议分批循环更新,避免锁表,占用大量UNDO。

#6


引用 4 楼 tw46015316 的回复:
Quote: 引用 3 楼 nie544917623 的回复:

临时表插入原表中的记录,然后插入增加的属性值,然后用select sum() ..from ... group by ..


那增加的属性值里面如果有date类型怎么办?sum是不是不能对date对象进行操作?

date类型就不行了,sum只能对数值使用

#7


你把你的需求以及可能的情况说清楚一些,也好对症下药

#8


重新建表的方式是最快的!
1、全表备份--》
2、Create Table TableName1  nologging As Select ....--》
3、删除源表Drop Table TableName Purge--》
4、Rename TableName1 To  TableName
有授权信息、索引、备注等等的,预先收集存储好,重建表后再重建索引、重新授权、重建备注等等!

数据量大的,Update非常慢,重建表速度是最快的!

#9


全表扫描少不了。可以找出该SQL语句的sql_id,在v$active_session_history中查看该语句执行的过程,关注event,看看时间花在了什么地方

#1


可以试下,create table as select...插入临时表,然后truncate原表,再插入回来 insert into...select...

#2


语句上没什么可以优化的地方,另外如果被更新的这几个字段上有索引的话,更新过程中会重建索引。可以先尝试一下分批更新,不行的话再考虑其他办法,比如快速游标之类的

#3


临时表插入原表中的记录,然后插入增加的属性值,然后用select sum() ..from ... group by ..

#4


引用 3 楼 nie544917623 的回复:
临时表插入原表中的记录,然后插入增加的属性值,然后用select sum() ..from ... group by ..


那增加的属性值里面如果有date类型怎么办?sum是不是不能对date对象进行操作?

#5


建议分批循环更新,避免锁表,占用大量UNDO。

#6


引用 4 楼 tw46015316 的回复:
Quote: 引用 3 楼 nie544917623 的回复:

临时表插入原表中的记录,然后插入增加的属性值,然后用select sum() ..from ... group by ..


那增加的属性值里面如果有date类型怎么办?sum是不是不能对date对象进行操作?

date类型就不行了,sum只能对数值使用

#7


你把你的需求以及可能的情况说清楚一些,也好对症下药

#8


重新建表的方式是最快的!
1、全表备份--》
2、Create Table TableName1  nologging As Select ....--》
3、删除源表Drop Table TableName Purge--》
4、Rename TableName1 To  TableName
有授权信息、索引、备注等等的,预先收集存储好,重建表后再重建索引、重新授权、重建备注等等!

数据量大的,Update非常慢,重建表速度是最快的!

#9


全表扫描少不了。可以找出该SQL语句的sql_id,在v$active_session_history中查看该语句执行的过程,关注event,看看时间花在了什么地方