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制約がない場合、デフォルト値はセットされない