デフォルト値ありカラム追加時の最適化

set timing on

drop table tab1;
create table tab1(col1 int);

declare
begin
for i in 1..1000000 loop
insert into tab1 values(i);
commit;
end loop;
end;
/

select sum(bytes) from user_segments where segment_name = 'TAB1';

alter table tab1 add (col2 char(100) default '123123' not null);

select * from tab1 where rownum < 10;

update tab1 set col2 = '123123';

 

→カラム追加はすぐに終了し、カラム追加時はセグメントサイズが増えないため、最適化されている模様

※追加するカラムにnot null制約がなくてもデフォルト値はセットされる。最適化もされる

(5.6)

 

drop table tab1;
create table tab1(col1 int);

drop procedure proc1;
delimiter //
create procedure proc1()
begin
declare i int;
set i = 0;
while i < 1000000 do
set i = i + 1;
insert into tab1 values(i);
end while;
end
//
delimiter ;

call proc1();

select (data_length+index_length)/1024/1024
from information_schema.tables
where table_schema=database()
and table_name = 'tab1'
;

alter table tab1 add col2 char(100) default '123123' not null;

select * from tab1 limit 10;

update tab1 set col2 = '123123';

→カラム追加は時間がかかり、カラム追加時はセグメントサイズが増えるため、最適化されていない模様

 ※追加するカラムにnot null制約がなくてもデフォルト値はセットされる。最適化はされない

 

(8.0.18)
※MySQL8.0.12で最適化(INSTANTモード)が導入された

alter table tab1 add col2 char(100) default '123123' not null ,algorithm=instant;

→カラム追加はすぐに終了し、カラム追加時はセグメントサイズが増えない

 

 

(10)

\timing 1

drop table tab1 cascade;
create table tab1(col1 int);

insert into tab1 select generate_series(1,10000000);

vacuum full tab1;
select pg_size_pretty(pg_relation_size('tab1'));

alter table tab1 add col2 char(100) default '123123' not null;

select * from tab1 limit 10;

update tab1 set col2 = '123123';


→カラム追加は時間がかかり、カラム追加時はセグメントサイズが増えるため、最適化されていない模様

※追加するカラムにnot null制約がなくてもデフォルト値はセットされる。最適化はされない
alter table tab1 add col2 char(100) default '123123' ;

(11)

\timing 1

drop table tab1 cascade;
create table tab1(col1 int);

insert into tab1 select generate_series(1,10000000);

vacuum full tab1;
select pg_size_pretty(pg_relation_size('tab1'));

alter table tab1 add col2 char(100) default '123123' not null;

select * from tab1 limit 10;

update tab1 set col2 = '123123';

 

→カラム追加はすぐに終了し、カラム追加時はセグメントサイズが増えないため、最適化されている模様

※追加するカラムにnot null制約がなくてもデフォルト値はセットされる。最適化もされる
alter table tab1 add col2 char(100) default '123123' ;

 

 

 

SET STATISTICS TIME ON


drop table tab1;
create table tab1(col1 int);

DECLARE @counter int;
SET @counter = 0;

WHILE (@counter < 1000000)
BEGIN
INSERT INTO tab1 (col1) VALUES (@counter);
SET @counter = @counter + 1;
END

EXEC sp_spaceused 'tab1';

alter table tab1 add col2 char(100) default '123123' not null;

select top 10 * from tab1;

update tab1 set col2 = '123123';

→カラム追加はすぐに終了し、カラム追加時はセグメントサイズが増えないため、最適化されている模様

※追加するカラムにnot null制約がない場合、デフォルト値はセットされない