永続的統計情報取得タイミング

(8.0.22)
https://dev.mysql.com/doc/refman/8.0/ja/innodb-persistent-stats.html#innodb-persistent-stats-auto-recalc

①アナライズ実行時
閾値以上のデータ更新時(バックグラウンド非同期)
③インデックス追加時

(確認)インデックス追加時に統計情報取得されるか?
drop table tab1;
create table tab1(col1 int primary key,col2 int);

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,i);
end while;
commit;
end
//
delimiter ;

call proc1(10000);

create index ind1 on tab1(col2);

select * from mysql.innodb_table_stats where table_name = 'tab1';
select * from mysql.innodb_index_stats where table_name = 'tab1';

 

(19c)

https://tech-oracle.blog.ss-blog.jp/2019-08-07
https://blogs.oracle.com/otnjp/tsushima-hakushi-76
https://bismarc256.hateblo.jp/entry/2020/05/28/200000

 

閾値以上のデータ更新+アナライズ実行時
閾値以上のデータ更新+自動メンテナンスタスク有効の場合(1日1回)
③インデックス追加時(追加インデックスのみ)
④オンライン統計収集 ダイレクト・パス・インサートを使用したINSERT INTO ... SELECT等で取得されることがある

 


⑤高頻度自動オプティマイザ統計収集 (Exadataのみ使用可能)
デフォルト無効

exec DBMS_STATS.SET_GLOBAL_PREFS ('AUTO_TASK_STATUS','ON');

SELECT dbms_stats.get_prefs('AUTO_TASK_STATUS') AUTO_TASK_STATUS,
dbms_stats.get_prefs('AUTO_TASK_INTERVAL') AUTO_TASK_INTERVAL,
dbms_stats.get_prefs('AUTO_TASK_MAX_RUN_TIME') AUTO_TASK_MAX_RUN_TIME
FROM dual;


⑥リアルタイム統計 (Exadataのみ使用可能)

デフォルト有効、無効化するにはヒント(NO_GATHER_OPTIMIZER_STATISTICS)を使用する

 

 

(確認)インデックス追加時に統計情報取得されるか?
drop table tab1 purge;
create table tab1(col1 int primary key,col2 int);

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


create index ind1 on tab1(col2);

select * from user_tab_statistics where table_name = 'TAB1';
select * from user_ind_statistics where table_name = 'TAB1';

 

 

(13)

①アナライズ実行時
閾値以上のデータ更新+自動バキュームONの場合(1分間隔)
③インデックス追加時(ただし、pg_classのみ)


(確認)インデックス追加時に統計情報取得されるか?

drop table tab1;
create table tab1(col1 int primary key,col2 int);

insert into tab1 select g,g from generate_series(1,10000) g;

create index ind1 on tab1(col2);

select * from pg_class where relname = 'tab1';
select * from pg_stats where tablename='tab1';

(2019)
https://blog.engineer-memo.com/2012/04/28/%E7%B5%B1%E8%A8%88%E6%83%85%E5%A0%B1%E3%81%AE%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%80%83%E5%AF%9F/


①アナライズ実行時
閾値以上のデータ更新+コンパイルありSQL実行時
③インデックス追加時(追加インデックスのみ)

(確認)インデックス追加時に統計情報取得されるか?

drop table tab1;
create table tab1(col1 int not null primary key,col2 int);

begin
set nocount on
declare @i integer;
set @i = 1;
begin transaction;
while @i <= 10000
begin
insert into tab1 values(@i,@i);
set @i = @i + 1;
end
commit;
end

create index ind1 on tab1(col2);


select object_name(object_id) as object_name,stats_date(object_id,stats_id) as update_date, * from sys.stats
where object_id = object_id('tab1')

select object_name(object_id) as object_name,stats_date(object_id,stats_id) as update_date, * from sys.stats_columns
where object_id = object_id('tab1')