はじめに
テーブルのカラム長を大きなサイズに設定した場合、性能劣化が発生することがあります。本記事は、カラム長による性能劣化の原因と対処方法についてご紹介します。
原因
性能劣化する原因は、SQL実行時、データ長ではなく、カラム長でメモリを確保するためです。例えば、格納されている実データ長が100バイトであってもカラム長をVARCHAR(1000)と設定していると、全ての行で1000バイトずつメモリの確保がされてしまうため、処理の実行時間が大幅に遅延してしまいます。
対処方法
対処方法は、以下のとおりです。・カラム長を実データ長にあわせる。
・Vertica 9.3で追加された拡張機能を使用する。
・Vertica 9.3で追加された拡張機能を使用する。
カラム長を実データ長にあわせる。
SQL Profileツールにて、対象テーブルの実データ長を確認することができます。実データ長にカラム長を修正いただくことで、余分なサイズを無くし、必要なサイズのみメモリ確保が行われるようにします。SQL Profileツールの使用方法は、以下リンク先をご参照ください。
http://vertica-tech.ashisuto.co.jp/sql-profile/
Vertica 9.3で追加された拡張機能を使用する。
Vertica 9.3の機能拡張により、VARCHAR型のデータに対する結合処理のアルゴリズムが新たに追加されました。Vertica 9.3以降のバージョンの場合、新アルゴリズムを使用することで、結合を行うクエリ実行時、VARCHAR型の余分なサイズをメモリ上で確保せず、効率よく処理されます。新しいアルゴリズムは、以下の方法で使用できます。
– [JoinDefaultTupleFormat]パラメーターの変更
– SQL文にてヒント句の指定
– SQL文にてヒント句の指定
[JoinDefaultTupleFormat]パラメーターの変更
JoinDefaultTupleFormatの設定値による、VARCHAR型の結合を行うクエリ実行時の違いは以下です。
設定値 | 説明 |
---|---|
f (fixed) | テーブル結合時、カラム長でメモリを確保する。デフォルト値。 |
v (variable) | テーブル結合時、実データ長でメモリを確保する。 |
以下の手順にて、設定値を v (variable) に変更することで使用されるアルゴリズムの変更が出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#現在のパラメーターを確認 SQL=> SELECT current_value,database_value,default_value,allowed_levels FROM CONFIGURATION_PARAMETERS WHERE parameter_name = 'JoinDefaultTupleFormat'; current_value | database_value | default_value | allowed_levels ---------------+----------------+---------------+------------------------- f | f | fixed | SESSION, USER, DATABASE (1 row) #パラメーター変更 SQL=> ALTER DATABASE testdb SET JoinDefaultTupleFormat = 'v'; ALTER DATABASE #パラメーターが変更されたことを確認 SQL=> SELECT current_value,database_value,default_value,allowed_levels FROM CONFIGURATION_PARAMETERS WHERE parameter_name = 'JoinDefaultTupleFormat'; current_value | database_value | default_value | allowed_levels ---------------+----------------+---------------+------------------------- v | v | fixed | SESSION, USER, DATABASE (1 row) |
SQL文にてヒント句の指定
対象がSQL単体の場合、ヒント句を指定することで結合アルゴリズムを変更することが出来ます。ヒント句は、SELECT句の後に /*+ SYNTACTIC_JOIN */ 、 JOIN句の後に /*+ JFMT(‘v’) */ を指定します。
1 2 3 |
#JFMT句で、f(カラム長)、v(データ長)を指定します。 SQL=> SELECT /*+ SYNTACTIC_JOIN */ COUNT(*) FROM t1 JOIN /*+ JFMT('v') */ t2 ON t1.col1= t2.col1; |
考慮事項
新アルゴリズム使用時の考慮事項は、以下のとおりです。・Merge JoinとEvent Series Joinには適用されない(今後拡張予定)。
・Join処理に使用される最大メモリサイズは4GB。
・Join Spill は行わない(今後、Join Spill をサポート予定)。
・すべてのJoin操作で性能が向上するわけではない。
・カラム長で処理する場合、固定長のメモリ領域を確保することができる。しかし、データ長で処理する場合は、データごとにメモリ確保を行う必要があり、オーバーヘッドが発生する。
・Join処理に使用される最大メモリサイズは4GB。
・Join Spill は行わない(今後、Join Spill をサポート予定)。
・すべてのJoin操作で性能が向上するわけではない。
・カラム長で処理する場合、固定長のメモリ領域を確保することができる。しかし、データ長で処理する場合は、データごとにメモリ確保を行う必要があり、オーバーヘッドが発生する。
参考情報
General Parametershttps://www.vertica.com/docs/12.0.x/HTML/Content/Authoring/AdministratorsGuide/ConfiguringTheDB/GeneralParameters.htm
> JoinDefaultTupleFormat