(5.7)
innodb_fill_factor
※インデックスに対して有効。最小:10、最大:100、デフォルト:100
※グローバル設定のみ
select @@global.innodb_fill_factor;
drop table tab1;
create table tab1(col1 int not null primary key,col2 varchar(30) );
create index ind1 on tab1(col2);
drop procedure proc1;
delimiter //
create procedure proc1()
begin
declare i bigint;
set i = 1;
while i <= 1000000 do
insert into tab1 values(i,lpad(i,30,'0'));
set i = i + 1;
end while;
end
//
delimiter ;
call proc1();
select count(*) from tab1;
analyze table tab1;
-- サイズ確認
select
table_name
,floor( (data_length+index_length)/1024/1024) as allmb
,floor( (data_length)/1024/1024) as dmb
,floor( (index_length)/1024/1024) as imb
from information_schema.tables
where table_name ='tab1';
innodb_fill_factor= 100の場合→ | tab1 | 97 | 56 | 40 |
innodb_fill_factor= 10の場合→ | tab1 | 97 | 56 | 40 |
→なぜか相違なし、原因不明
-- 参照速度確認
pager cat /dev/null
select * from tab1 use index (ind1);
nopager
innodb_fill_factor= 100の場合→ 0.51 sec
innodb_fill_factor= 10の場合→ 0.52 sec
-- 更新速度確認
update tab1 set col2 = concat(substring(col2,1,29),'Y');
innodb_fill_factor= 100の場合→ 25.90 sec
innodb_fill_factor= 10の場合→ 27.80 sec
(19c)
PCTFREEの値は、0から99の値にする必要があります。
値に0を指定した場合は、ブロック全体が一杯になるまで新しい行を挿入できます。デフォルト値は10です。
※インデックスについても指定可能。最小:0、最大:99、デフォルト:10
drop table tab1 purge;
drop table tab2 purge;
create table tab1(col1 int not null primary key,col2 varchar2(30) ) pctfree 0;
create table tab2(col1 int not null primary key,col2 varchar2(30) ) pctfree 90;
select table_name,pct_free,pct_used from user_tables where table_name in ('TAB1','TAB2');
declare
begin
for i in 1..1000000 loop
insert into tab1 values(i,'AAAAAAAAAABBBBBBBBBBCCCCCCCCCC');
insert into tab2 values(i,'AAAAAAAAAABBBBBBBBBBCCCCCCCCCC');
commit;
end loop;
end;
/
select count(*) from tab1;
select count(*) from tab2;
exec dbms_stats.gather_table_stats('TEST','TAB1');
exec dbms_stats.gather_table_stats('TEST','TAB2');
-- サイズ確認
select sum(bytes/1024/1024) mb from user_segments where segment_name = 'TAB1';
select sum(bytes/1024/1024) mb from user_segments where segment_name = 'TAB2';
tab1→ 41MB
tab2→ 416MB
-- 参照速度確認
set time on
set timing on
set feed only
select * from tab1;
select * from tab2;
tab1→ 経過: 00:00:00.93
tab2→ 経過: 00:00:01.08
-- 更新速度確認
set time on
set timing on
set feed only
update tab1 set col2 = substr(col2,1,29)||'Y';
update tab2 set col2 = substr(col2,1,29)||'Y';
tab1→ 経過: 00:00:07.35
tab2→ 経過: 00:00:11.50
(13)
https://kyabatalian.hatenablog.com/entry/2017/12/16/160754
テーブルのフィルファクタ(fillfactor)は10から100までの間の割合(パーセント)です。 100(すべて使用)がデフォルトです
※インデックスについても指定可能。最小:10、最大:100、デフォルト:90
drop table tab1 cascade;
drop table tab2 cascade;
create table tab1(col1 int not null primary key,col2 varchar(30) ) with (fillfactor=100);
create table tab2(col1 int not null primary key,col2 varchar(30) ) with (fillfactor=10);
\d+ tab1
\d+ tab2
do $$
declare
begin
for i in 1..1000000 loop
insert into tab1 values(i,'AAAAAAAAAABBBBBBBBBBCCCCCCCCCC');
insert into tab2 values(i,'AAAAAAAAAABBBBBBBBBBCCCCCCCCCC');
end loop;
end
$$ language plpgsql;
select count(*) from tab1;
select count(*) from tab2;
analyze tab1;
analyze tab1;
-- サイズ確認
select pg_size_pretty(pg_relation_size('tab1'));
select pg_size_pretty(pg_relation_size('tab2'));
tab1→ 65MB
tab2→ 710MB
-- 参照速度確認
\timing 1
explain analyze
select * from tab1;
explain analyze
select * from tab2;
tab1→ 108.293 ms
tab2→ 275.059 ms
-- 更新速度確認
\timing 1
explain analyze
update tab1 set col2 = substr(col2,1,29)||'Y';
explain analyze
update tab2 set col2 = substr(col2,1,29)||'Y';
tab1→ 7461.973 ms
tab2→ 4736.785 ms
(2019)
http://b00k.jp/2018/09/12/post-0-46/
https://docs.microsoft.com/ja-jp/sql/relational-databases/indexes/specify-fill-factor-for-an-index?view=sql-server-ver15
※インデックスのみ指定可能。最小:1、最大:100、デフォルト:0
※FILL FACTOR 値 0 と 100 の機能は、まったく同じです。
drop table tab1;
drop table tab2;
create table tab1(col1 int not null primary key,col2 varchar(30) );
create table tab2(col1 int not null primary key,col2 varchar(30) );
create index ind1 on tab1(col2) with( fillfactor = 100);
create index ind2 on tab2(col2) with( fillfactor = 10);
select name,fill_factor from sys.indexes where name in ('ind1','ind2');
declare @i int = 1;
while (@i <= 1000000)
begin
insert into tab1 values(@i,right('000000000000000000000000000000' + convert(varchar,@i), 30));
insert into tab2 values(@i,right('000000000000000000000000000000' + convert(varchar,@i), 30));
set @i = @i + 1;
end
select count(*) from tab1;
select count(*) from tab2;
update statistics tab1;
update statistics tab2;
-- サイズ確認
exec sp_spaceused 'dbo.tab1';
exec sp_spaceused 'dbo.tab2';
tab1→ index_size = 44240 KB
tab2→ index_size = 44240 KB
→なぜか相違なし、原因不明
-- 参照速度確認
set statistics time on
select * from tab1 with (index(ind1));
select * from tab2 with (index(ind2));
tab1→ 経過時間 = 経過時間 = 4540 ミリ秒
tab2→ 経過時間 = 経過時間 = 4534 ミリ秒
-- 更新速度確認
set statistics time on
update tab1 set col2 = substring(col2,1,29)+'Y';
update tab2 set col2 = substring(col2,1,29)+'Y';
tab1→ 経過時間 = 経過時間 = 35567 ミリ秒
tab2→ 経過時間 = 経過時間 = 37100 ミリ秒