(8.0.26)
https://qiita.com/terra_yucco/items/6e4f02f8aaff25529dec
-- 1. データファイル移動先の準備
mkdir -p /home/mysql/tbs1
chown -R mysql:mysql /home/mysql
vim /etc/my.cnf
innodb_directories=/home/mysql
systemctl restart mysqld
select @@innodb_directories;
select * from information_schema.INNODB_TABLESPACES;
create tablespace tbs1 add datafile '/home/mysql/tbs1/tbs11.ibd' engine=innodb;
-- 2. テストテーブル作成し100万件データ投入
drop table tab1;
create table tab1(col1 int auto_increment primary key,col2 datetime(6) );
drop procedure proc1;
delimiter //
create procedure proc1(in x int)
begin
declare i bigint;
set i = 0;
start transaction;
while i < x do
set i = i + 1;
insert into tab1(col2) values(CURRENT_TIMESTAMP(6) );
end while;
commit;
end
//
delimiter ;
call proc1(1000000);
select count(*) from tab1;
-- 3. データ投入しながらデータファイル移動
drop procedure proc1;
delimiter //
create procedure proc1()
begin
while true do
insert into tab1(col2) values(CURRENT_TIMESTAMP(6) );
end while;
end
//
delimiter ;
call proc1();
alter table tab1 tablespace tbs1;
-- 4. データファイル移動中の最大待ち時間確認
select * from tab1 order by col1 limit 100;
select col1,col2
,lag(col2) over(order by col1) col3
,( col2 - lag(col2) over(order by col1) ) col4
,TIMESTAMPDIFF(MICROSECOND , lag(col2) over(order by col1) ,col2 ) col5
from tab1
order by col5 desc limit 100;
※datetime型の引き算は数字列の差分となる
→0.062723秒
オンライン実行可能
(19c)
-- 1. データファイル移動先の準備
mkdir /home/oracle/pdb1
-- 2. テストテーブル作成し100万件データ投入
drop table tab1 purge;
create table tab1(col1 int generated by default as identity primary key, col2 timestamp) tablespace users;
alter session set nls_timestamp_format='HH24:MI:SSXFF';
declare
begin
for i in 1..1000000 loop
insert into tab1(col2) values(systimestamp);
end loop;
end;
/
commit;
select count(*) from tab1;
-- 3. データ投入しながらデータファイル移動
declare
begin
while true loop
insert into tab1(col2) values(systimestamp);
commit;
end loop;
end;
/
select file_id,file_name from dba_data_files order by file_id;
alter database move datafile 11 to '/home/oracle/pdb1/users01.dbf' ;
-- 4. データファイル移動中の最大待ち時間確認
select * from tab1 order by col1 fetch first 100 rows only;
select col1,col2
,lag(col2) over(order by col1) col3
,( col2 - lag(col2) over(order by col1) ) col4
from tab1
order by col4 desc fetch first 100 rows only;
→1.553268秒
オンライン実行可能
(14)
-- 1. データファイル移動先の準備
sudo mkdir -p /home/postgres/tbs1
sudo chown -R postgres:postgres /home/postgres
\db+
create tablespace tbs1 owner postgres location '/home/postgres/tbs1';
-- 2. テストテーブル作成し100万件データ投入
drop table tab1;
create table tab1(col1 int generated by default as identity primary key,col2 timestamp);
insert into tab1(col2) select clock_timestamp() from generate_series(1,1000000) g;
select count(*) from tab1;
-- 3. データ投入しながらデータファイル移動
create or replace procedure proc1()
language plpgsql
as $$
begin
while true loop
insert into tab1(col2) values(clock_timestamp() );
commit;
end loop;
end
$$;
call proc1();
alter table tab1 set tablespace tbs1;
-- 4. データファイル移動中の最大待ち時間確認
\pset pager 0
select * from tab1 order by col1 fetch first 100 rows only;
select col1,col2
,lag(col2) over(order by col1) col3
,( col2 - lag(col2) over(order by col1) ) col4
from tab1
order by col4 desc fetch first 100 rows only;
→0.730655秒
オンライン実行可能
(2019)
-- 1. データファイル移動先の準備
mkdir C:\test
alter database test remove file tbs1_01;
alter database test remove filegroup tbs1;
alter database test add filegroup tbs1;
alter database test add file
(name = tbs1_01 ,filename = 'C:\test\tbs1_01.ndf'
) to filegroup tbs1
;
-- 2. テストテーブル作成し100万件データ投入
drop table tab1;
create table tab1(col1 int identity(1,1) not null,col2 datetime2);
alter table tab1 add constraint tab1pk primary key(col1);
set nocount on
declare @i int;
set @i = 1;
begin transaction;
while @i <= 1000000
begin
insert into tab1(col2) values(getdate() );
set @i = @i + 1;
end
commit;
select count(*) from tab1;
-- 3. データ投入しながらデータファイル移動
set nocount on;
while 1=1
begin
begin transaction;
insert into tab1(col2) values(getdate() );
commit;
end
alter table tab1 drop tab1pk with ( move to tbs1 );
-- 4. データファイル移動中の最大待ち時間確認
select top 100 * from tab1 order by col1;
select top 100 col1,col2
,lag(col2) over(order by col1) col3
,datediff(MICROSECOND,lag(col2) over(order by col1),col2) col4
from tab1
order by col4 desc;
→0.353333秒
オンライン実行可能