統計情報とは
統計情報を収集することで、クエリ実行時にオプティマイザが正しいプロジェクションを選択する精度が向上し安定したパフォーマンスを得ることができます。統計情報の収集を実行すると、ディスクのデータを読み込み、カーディナリティや、データの各ノードの分散状況といった情報を収集します。収集したデータはカタログに書き込まれます。
統計情報を取得するタイミング
統計情報は可能な限り最新であることが好ましいため、日毎のバッチ処理に組み込む等頻繁に取得することが理想的です。頻繁に取得することが難しい場合は、以下のタイミングを目安として取得してください。
・初期データロード後
・データが50%以上変更された場合
・時間が経過して、クエリのパフォーマンスが変わった場合
統計情報の取得方法
ANALYZE_STATISTICS()関数を使用することにより、統計情報を取得できます。
ANALYZE_STATISTICS()関数
構文
ANALYZE_STATISTICS()関数の構文は以下です。
dbadmin=> SELECT ANALYZE_STATISTICS('テーブル名','カラム名',パーセンテージ);パラメータ | 説明 |
|---|---|
テーブル名 | 統計情報を取得したいテーブルを指定します。 |
カラム名 | 統計情報を取得したいカラムをカンマ区切りで指定します。 |
パーセンテージ | ディスクから取得するデータの割合を指定します。 |
実行例
例①: table1テーブルの全カラムについて、統計情報を10%取得する場合
dbadmin=> dbadmin=> SELECT ANALYZE_STATISTICS('table1');
ANALYZE_STATISTICS
--------------------
0 ★正常終了
(1 row)例②: table1テーブルの col1,col2,col3 カラムについて、統計情報を50%取得する場合
dbadmin=> SELECT ANALYZE_STATISTICS('table1','col1,col2,col3',50);
ANALYZE_STATISTICS
--------------------
0 ★正常終了
(1 row)注意点
truncate table 実行後の統計情報について
Vertica9.2 以前と、Vertica9.3 以降では、TRUNCATE TABLE 後の統計情報について、以下のとおりに保持のされ方が違います。
Vertica9.2 以前: ①統計情報=「あり」 ⇒ ②TRUNCATE TABLE ⇒ ③統計情報=「あり」
Vertica9.3 以降: ①統計情報=「あり」 ⇒ ②TRUNCATE TABLE ⇒ ③統計情報=「なし」
Vertica9.3 以降で「日次/月次処理でデータの洗い替えをする場合」や「性能検証でデータの入れ直しをする場合」は、テーブルにデータを追加後に、統計情報を再取得してください。統計情報を再取得しない場合、実行計画は最適なパスが選択されずに、性能劣化が発生するのでご注意ください。
実行例
例: truncate table 実行後の統計情報を取得した結果
########## 9.2 以前 ##########
# 統計情報の状態を確認
dbadmin=> select table_name,statistics_type from projection_columns where table_name = 't1';
table_name | statistics_type
------------+-----------------
t1 | FULL ★統計あり
(1 row)
# truncate table を実行
dbadmin=> truncate table t1;
TRUNCATE TABLE
# 統計情報の状態を確認
dbadmin=> select table_name,statistics_type from projection_columns where table_name = 't1';
table_name | statistics_type
------------+-----------------
t1 | FULL ★統計あり
(1 row)
########## 9.3 以降 ##########
# 統計情報の状態を確認
dbadmin=> select table_name,statistics_type from projection_columns where table_name = 't1';
table_name | statistics_type
------------+-----------------
t1 | FULL ★統計あり
(1 row)
# truncate table を実行
dbadmin=> truncate table t1;
TRUNCATE TABLE
# 統計情報の状態を確認
dbadmin=> select table_name,statistics_type from projection_columns where table_name = 't1';
table_name | statistics_type
------------+-----------------
t1 | NONE ★統計なし
(1 row)読み込むデータ量によるパフォーマンスの影響について
読み込むデータ量を指定(1~100%)して統計情報を取得する場合、より精度の高い統計情報を取得することができます。しかし大量のデータを読み込むことから、パフォーマンスに影響を与える可能性があるため、使用するテーブルや時間帯にご注意ください。
参考情報
ANALYZE_STATISTICS
https://www.vertica.com/docs/11.0.x/HTML/Content/Authoring/SQLReferenceManual/Functions/VerticaFunctions/ANALYZE_STATISTICS.htm
PROJECTION_COLUMNS
https://www.vertica.com/docs/11.0.x/HTML/Content/Authoring/SQLReferenceManual/SystemTables/CATALOG/PROJECTION_COLUMNS.htm
統計情報が取得されたタイムスタンプ
https://www.ashisuto.co.jp/cm/analytics-database/last_update_of_statistics.html
統計情報をコピーする方法
https://www.ashisuto.co.jp/cm/analytics-database/statistics-copy.html
検証バージョンについて
この記事の内容はVertica 11.0で確認しています。
更新履歴
2022/02/15 バージョン11.0用に改訂、
全体的に体裁を変更、
統計情報の取得方法に実行例を追加、
注意点に truncate table を追加、
参考情報 に PROJECTION_COLUMNS、統計情報が取得されたタイムスタンプ、
統計情報をコピーする方法 を追加
2018/08/29 バージョン9.2用に改訂
2016/06/19 本記事を公開