①アナライズ実行時
②閾値以上のデータ更新時(バックグラウンド非同期)
③インデックス追加時
(確認)インデックス追加時に統計情報取得されるか?
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';
①アナライズ実行時
②閾値以上のデータ更新+コンパイルあり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')