大量データ更新後、コミット前の状態でテーブルダンプを実行
処理時間を通常時比較
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倍