大量更新中のダンプ時間

 


大量データ更新後、コミット前の状態でテーブルダンプを実行
処理時間を通常時比較

1.5~3倍の時間となる

(8.0.29)

-- 1. テストデータ作成

drop table tab1;
create table tab1(
    col1 int primary key
   ,col2 bigint
   ,col3 datetime
   ,col4 varchar(100)
   ,col5 char(100)
   );


drop procedure proc1;

delimiter //
create procedure proc1(in x int)
begin
  declare i int;
  set i = 0;
  start transaction;
  while i < x do
    set i = i + 1;
    insert into tab1 values(
     i
    ,floor(rand() * 1000000000000)+1
    ,date_add('2001-01-01', interval floor(365*20*24*3600 * rand() ) second)
    ,substring(md5(rand() ), 1, 30)
    ,substring(md5(rand() ), 1, 30)
    );
  end while;
  commit;
end
//
delimiter ;

call proc1(10000000);
select count(*) from tab1;


-- 2. トランザクション中で更新

start transaction;
update tab1
set col2 = 0 ,col3=now() ,col4='A' ,col5='A';

 


-- 3. ダンプ実行

time mysqldump -u root test tab1 -p --quick --source-data=2 --flush-logs --single-transaction > tab1.sql

 

-- 4. 結果

大量更新中の場合→
real    0m34.150s
user    0m12.364s
sys     0m2.275s


大量更新無の場合→
real    0m17.552s
user    0m10.759s
sys     0m1.467s


大量更新中のダンプ時間は通常時の約2倍

(19c)


-- 1. テストデータ作成

drop table tab1 purge;
create table tab1(
    col1 int primary key
   ,col2 int
   ,col3 timestamp
   ,col4 varchar2(100)
   ,col5 char(100)
   );

declare
begin
for i in 1..10000000 loop
  insert into tab1 values
  (i
  ,floor(dbms_random.value(1, 1000000000001) )
  ,to_date('20010101','yyyymmdd') + floor(dbms_random.value(0, 365*20*24*3600) )/24/3600
  ,substr(standard_hash(dbms_random.value(), 'MD5'),1,30)
  ,substr(standard_hash(dbms_random.value(), 'MD5'),1,30)
  );
end loop;
end;
/

commit;
select count(*) from tab1;


-- 2. トランザクション中で更新

update tab1
set col2 = 0 ,col3=systimestamp ,col4='A' ,col5='A';

-- 3. ダンプ実行

time expdp test/test@pdb1 directory=ORA_DIR dumpfile=tab1.dmp logfile=tab1.log tables=TAB1 reuse_dumpfiles=yes

 


-- 4. 結果

大量更新中の場合→
real    1m0.308s
user    0m0.017s
sys     0m0.053s

大量更新無の場合→
real    0m37.200s
user    0m0.016s
sys     0m0.065s


大量更新中のダンプ時間は通常時の約2倍

 

(14)

-- 1. テストデータ作成

drop table tab1;
create table tab1(
    col1 int primary key
   ,col2 bigint
   ,col3 timestamp
   ,col4 varchar(100)
   ,col5 char(100)
   );

start transaction;
insert into tab1 select
   g
  ,floor(random() * 1000000000000)+1
  ,'2001-01-01'::date + CAST( floor(365*20*24*3600*random() ) || 'second' AS interval)
  ,substring(md5(random()::text), 1, 30)
  ,substring(md5(random()::text), 1, 30)
from generate_series(1,10000000) g;

commit;

select count(*) from tab1;


-- 2. トランザクション中で更新

start transaction;
update tab1
set col2 = 0 ,col3=clock_timestamp() ,col4='A' ,col5='A';

-- 3. ダンプ実行

time pg_dump -Fp -t tab1 test > tab1.sql


-- 4. 結果

大量更新中の場合→
real    0m19.545s
user    0m0.782s
sys     0m1.367s


大量更新無の場合→
real    0m13.283s
user    0m0.792s
sys     0m1.396s


大量更新中のダンプ時間は通常時の約1.5倍

(2019)


-- 1. テストデータ作成

drop table tab1;
create table tab1(
    col1 int primary key
   ,col2 bigint
   ,col3 datetime2
   ,col4 varchar(100)
   ,col5 char(100)
   );


set nocount on
declare @i int;
set @i = 1;
begin transaction;
while @i <= 10000000
begin
  insert into tab1 values(
     @i
    ,floor(rand() * 1000000000000)+1
    ,dateadd(second,floor(365*20*24*3600 * rand() ),'2001-01-01')
    ,substring(master.dbo.fn_varbintohexstr(HASHBYTES('MD5',cast(rand() as varchar) ) ),3,30)
    ,substring(master.dbo.fn_varbintohexstr(HASHBYTES('MD5',cast(rand() as varchar) ) ),3,30)
    );
  set @i = @i + 1;
end
commit;
select count(*) from tab1;

 

 

-- 2. トランザクション中で更新

ALTER DATABASE test SET READ_COMMITTED_SNAPSHOT ON with rollback after 1 seconds;
DBCC USEROPTIONS;

begin transaction;
update tab1
set col2 = 0 ,col3=GETDATE() ,col4='A' ,col5='A';


-- 3. ダンプ実行

bcp test.dbo.tab1 out "C:\tab1.csv"  -T -c -t,

 

-- 4. 結果

大量更新中の場合→
ネットワーク パケット サイズ (バイト): 4096
クロック タイム (ミリ秒) 合計     : 107125 平均 : (93348.89 行/秒)

大量更新無の場合→
ネットワーク パケット サイズ (バイト): 4096
クロック タイム (ミリ秒) 合計     : 35547  平均 : (281317.69 行/秒)


大量更新中のダンプ時間は通常時の約3倍