如何高效的更新大量数据 -- 有待考究

本文介绍了一种高效的更新大量数据的方法,通过创建临时表并在其上执行更新操作,再将临时表重命名为目标表,大大减少了更新时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

来自ITPUB:无休无止

http://eagle_fan.itpub.net/post/461/10912

 

通常我们使用update来进行更新操作。不过,update操作是一项很昂贵的操作,具体为什么如此昂贵,将在后面的文章中介绍。

我在这里给出了一个例子,来谈谈如何高效的更新大量数据。例子中的表的数据量为10w行。

Update操作需要2分钟的时间,而新方法只要不到一秒钟!!

蓝色标记部分为注释。

 

SQL> set timing on

@@打开计时选项


SQL> desc dba_objects;
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------------

 OWNER                                              VARCHAR2(30)
 OBJECT_NAME                                        VARCHAR2(128)
 SUBOBJECT_NAME                                     VARCHAR2(30)
 OBJECT_ID                                          NUMBER
 DATA_OBJECT_ID                                     NUMBER
 OBJECT_TYPE                                        VARCHAR2(18)
 CREATED                                            DATE
 LAST_DDL_TIME                                      DATE
 TIMESTAMP                                          VARCHAR2(19)
 STATUS                                             VARCHAR2(7)
 TEMPORARY                                          VARCHAR2(1)
 GENERATED                                          VARCHAR2(1)
 SECONDARY                                          VARCHAR2(1)

Elapsed: 00:00:00.40
SQL> connect / as sysdba;
Connected.
SQL> create table test as
  2  select owner,object_name,object_id
  3  from dba_objects;

Table created.

Elapsed: 00:00:01.63

@@创建测试表test


SQL> select count(*) from test;

  COUNT(*)
----------
      3261

Elapsed: 00:00:00.40
SQL> insert into test
  2  select * from test;

3261 rows created.

Elapsed: 00:00:00.61
SQL> insert into test
  2  select * from test;

6522 rows created.

Elapsed: 00:00:00.71
SQL> insert into test
  2  select * from test;

13044 rows created.

Elapsed: 00:00:00.21
SQL> select count(*) from test;

  COUNT(*)
----------
     26088

Elapsed: 00:00:00.40
SQL> insert into test
  2  select * from test;

26088 rows created.

Elapsed: 00:00:01.81
SQL> insert into test
  2  select * from test;

52176 rows created.

Elapsed: 00:00:01.63
SQL> select count(*) from test;

  COUNT(*)
----------
    104352

Elapsed: 00:00:00.20

@@向测试表中塞入10w行数据


SQL> desc test;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 OWNER                                              VARCHAR2(30)
 OBJECT_NAME                                        VARCHAR2(128)
 OBJECT_ID                                          NUMBER

SQL> update test
  2  set object_name=lower(object_name);

104352 rows updated.

Elapsed: 00:01:90.20

@@向test表中跟新10w行数据,耗时00:01:90.20

SQL> create table test2
  2  as select owner,lower(object_name) object_name,object_id
  3  from test;

Table created.

Elapsed: 00:00:00.41
SQL> select count(*) from test2;

  COUNT(*)
----------
    104352

Elapsed: 00:00:00.30

@@创建临时表test2,将更新的语句写在select子句中,耗时一秒钟不到


SQL> drop table test;

Table dropped.

@@将原来的test表drop掉

Elapsed: 00:00:00.40
SQL> rename test2 to test;

Table renamed.

Elapsed: 00:00:00.70

@@将临时表更名为test表

后记:这只是一个例子,用于说明一种高效的更新数据的方法。

         对于实际应用来讲,如果原来的表含有索引,授权,约束等的话,需要在新表上面重新创建。

         对于索引的创建,也有很多高效的方法。所以对于大批量的数据更新,采用上面所示的方法更为高效。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值