AnalyticDB for PostgreSQLは、より高いデータ圧縮率とクエリパフォーマンスを提供するために、カラムストアモデルをサポートしています。 ただし、AnalyticDB for PostgreSQLが少量のデータしか返さないクエリを処理する場合、列全体のデータを読み取るか、Bツリーインデックスを作成する必要があります。 Bツリーインデックスにも潜在的な問題があります。 たとえば、インデックスが圧縮されていないため、深刻なデータ膨張が発生する場合があります。 大量のクエリ結果が返された場合、インデックスはシーケンシャルスキャンよりもコストが高くなるか、失敗する可能性があります。 これらの問題を解決するために、AnalyticDB for PostgreSQLは優れたフィルターパフォーマンスを提供し、最小限のストレージ容量を占有するMetaScan機能を提供します。
MetaScan機能は、20200826以降のマイナーバージョンで作成された、予約済みストレージモードのAnalyticDB for PostgreSQLインスタンスでのみサポートされます。
この機能は、エラスティックストレージモードのAnalyticDB for PostgreSQLインスタンスではサポートされていません。
MetaScanの有効化
MetaScan機能は、次のパラメータによって制御されます。
RDS_ENABLE_CS_ENHANCEMENT
メタデータを収集するかどうかを指定します。 ONに設定すると、メタデータ収集が有効になります。 OFFに設定されている場合、メタデータ収集は無効になります。 デフォルトでは、このパラメータはONに設定されています。 値がONの場合、列指向テーブルのデータが変更されると、システムはテーブルのメタデータを自動的に収集します。 このパラメーターはインスタンスレベルのパラメーターです。 値を変更する場合は、チケットを起票してください。
RDS_ENABLE_COLUMN_META_SCAN
クエリのMetaScan機能を有効にするかどうかを指定します。 ONに設定されている場合、この機能はクエリに対して有効になります。 OFFに設定されている場合、この機能はクエリに対して無効になります。 デフォルトでは、このパラメータはOFFに設定されています。 このパラメーターはセッションレベルのパラメーターです。 次のSQL文を実行することで、その値を表示および変更できます。
MetaScanが有効かどうかを確認します。
SHOW RDS_ENABLE_COLUMN_META_SCAN;MetaScanを無効にします。
SET RDS_ENABLE_COLUMN_META_SCAN = OFF;MetaScanを有効にします。
SET RDS_ENABLE_COLUMN_META_SCAN = ON;
RDS_ENABLE_CS_ENHANCEMENTがOFFに設定されている場合、すべての列指向テーブルのメタデータ収集は無効になります。 RDS_ENABLE_CS_ENHANCEMENTがONに設定されているときにMetaScan機能を使用する場合は、次のステートメントを実行してテーブルのメタデータを再収集します。
ALTER TABLE table_name SET WITH (REORGANIZE=TRUE);MetaScanがクエリに使用されているかどうかを確認する
次の図に示すように、EXPLAINステートメントを使用して、SELECTステートメントがMetaScanを使用しているかどうかを確認できます。
結果に表示される「追加のみの列メタスキャン」ノードは、MetaScanノードです。 これは、MetaScan機能がクエリに使用されることを示します。
MetaScanでサポートされているデータ型と演算子
MetaScanは次のデータ型をサポートしています。
INT2、INT4、およびINT8
FLOAT4とFLOAT8
TIME、TIMETZ、TIMESTAMP、およびTIMESTAMPTZ
VARCHAR、テキスト、およびBPCHAR
現金
MetaScanは次の演算子をサポートしています。
=, <, <=, >, および>=
AND論理演算子
既存のインスタンスを更新してMetaScanを使用する
既存のインスタンスに対してMetaScanを使用する場合は、次の操作を実行します。
AnalyticDB for PostgreSQLインスタンスのマイナーバージョンを更新する
AnalyticDB for PostgreSQLコンソールで、マイナーバージョンを更新するインスタンスを見つけ、IDをクリックします。 表示されるページの右上隅にある [マイナーバージョンのアップグレード] をクリックします。
テーブルのメタデータを更新する
マイナーバージョンを更新した後、テーブルのメタデータを最新バージョンに更新します。 RDS_ENABLE_CS_ENHANCEMENTがOFFに設定されている場合、チケットを起票します。 RDS_ENABLE_CS_ENHANCEMENTがONに設定されている場合、次の操作を実行します。
更新機能を管理者として作成します。
CREATE OR REPLACE FUNCTION UPGRADE_AOCS_TABLE_META(tname TEXT) RETURNS BOOL AS $$ DECLARE tcount INT := 0; BEGIN -- CHECK TABLE NAME EXECUTE 'SELECT COUNT(1) FROM PG_AOCSMETA WHERE RELID = ''' || tname || '''::REGCLASS' INTO tcount; IF tcount IS NOT NULL THEN IF tcount > 1 THEN RAISE EXCEPTION 'found more than one table of name %', tname; ELSEIF tcount = 0 THEN RAISE EXCEPTION 'not found target table in pg_aocsmeta, table name:%', tname; END IF; END IF; EXECUTE 'ALTER TABLE ' || tname || ' SET WITH(REORGANIZE=TRUE)'; RETURN TRUE; END; $$ LANGUAGE PLPGSQL;次のSQL文を実行して、管理者またはテーブル所有者としてテーブルのメタデータを更新します。
SELECT UPGRADE_AOCS_TABLE_META(table_name);次のSQL文を実行してメタデータのバージョンを確認します。
SELECT version = 4 AS is_latest_version FROM pg_appendonly WHERE relid = 'test'::REGCLASS
ソートキーを使用してMetaScanのパフォーマンスを向上させる
AnalyticDB for PostgreSQLのソートキー機能は、テーブル内のデータを特定の列でソートします。 MetaScanとソートキー機能の組み合わせにより、MetaScanのパフォーマンスが向上します。 列指向テーブルはデータをブロック単位で格納します。 MetaScanはメタデータを使用して、ブロックがクエリ条件を満たすかどうかを確認し、クエリ条件を満たさないブロックをスキップします。 これにより、I/O操作が減り、スキャンパフォーマンスが向上します。 フィルタリングされた列のデータがすべてのブロックに分散している場合、クエリで少量のデータが返される場合でも、すべてのブロックをスキャンする必要があります。 フィルタリングされた各列にソートキーを作成すると、列内の同じデータが複数の連続したブロックに結合されます。 このように、MetaScanは、クエリ条件を満たさないブロックを除外することにより、スキャンパフォーマンスを向上させることができます。
ソートキーの作成方法の詳細については、「ソートキーとラフセットインデックスを使用して列指向テーブルでのクエリを高速化する」をご参照ください。
制限事項
ORCAオプティマイザが使用されている場合、MetaScanは使用できません。 次のステートメントを実行して、ORCAオプティマイザーが使用されているかどうかを確認できます。
SHOW OPTIMIZER;onが返された場合、ORCAオプティマイザーが使用されます。 ORCAオプティマイザーの詳細については、「クエリオプティマイザーの選択」をご参照ください。