このトピックでは、HypoPG拡張機能を使用して、ApsaraDB RDS for PostgreSQLインスタンスの仮想インデックスを作成する方法について説明します。 作成した仮想インデックスを使用して、インデックスがクエリパフォーマンスを向上できるかどうかを確認できます。 仮想インデックスは実際のインデックスではなく、CPUコアやディスクリソースなどのリソースを消費しません。
前提条件
RDSインスタンスは、20230830以降のマイナーエンジンバージョンを実行します。
重要この拡張機能は、20230830以前の一部のマイナーエンジンバージョンでサポートされています。 ただし、ApsaraDB RDSは、標準化された拡張機能管理とセキュリティ強化のために、マイナーエンジンバージョンの更新で脆弱な拡張機能を最適化する予定です。 したがって、20230830より前のマイナーエンジンバージョンを実行するRDSインスタンスでは、この拡張機能を作成することはできません。 詳細については、「 [製品の変更 /機能の変更] ApsaraDB RDS For PostgreSQLインスタンスの拡張機能作成の制限」をご参照ください。
20230830より前のマイナーエンジンバージョンを実行するRDSインスタンス用にこの拡張機能を既に作成している場合は、引き続きこの拡張機能を使用できます。
このエクステンションを初めて作成する場合、またはRDSインスタンスのエクステンションを再作成する必要がある場合は、RDSインスタンスのマイナーエンジンバージョンを最新バージョンに更新する必要があります。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
RDSインスタンスへの接続には、特権アカウントが使用されます。 ApsaraDB RDSコンソールの [アカウント] ページで、使用するアカウントのタイプを確認できます。 アカウントが標準アカウントの場合、特権アカウントを作成し、その特権アカウントを使用してRDSインスタンスに接続する必要があります。 詳細については、「アカウントの作成」をご参照ください。
この拡張機能は、PostgreSQL 17を実行するApsaraDB RDS for PostgreSQLインスタンスではサポートされていません。
HypoPG拡張を有効または無効にする
仮想インデックスは、現在のセッションでのみ有効です。
次のステートメントを実行して、HypoPG拡張を有効にします。
CREATE EXTENSION hypopg;
説明特権アカウントにのみ、上記のステートメントを実行する権限が付与されます。
次のステートメントを実行して、HypoPG拡張機能を無効にします。
DROP EXTENSION hypopg;
説明特権アカウントにのみ、上記のステートメントを実行する権限が付与されます。
例
テーブルを作成し、テストデータをテーブルに挿入します。
create extension hypopg; CREATE TABLE hypo (id integer, val text) ; INSERT INTO hypo SELECT i, 'line ' || i FROM generate_series(1, 100000) i ; VACUUM ANALYZE hypo ;
テーブルにインデックスが作成されていない場合のSQL文の実行計画のクエリパフォーマンスを確認します。
EXPLAIN SELECT val FROM hypo WHERE id = 1; QUERY PLAN -------------------------------------------------------- Seq Scan on hypo (cost=0.00..1791.00 rows=1 width=14) Filter: (id = 1) (2 rows)
仮想インデックスを作成します。
SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)') ; indexrelid | indexname ------------+---------------------- 18284 | <18284>btree_hypo_id (1 row)
仮想インデックスが実行計画のクエリパフォーマンスを向上させるかどうかを確認します。
EXPLAIN SELECT val FROM hypo WHERE id = 1; QUERY PLAN ---------------------------------------------------------------------------------- Index Scan using <18284>btree_hypo_id on hypo (cost=0.04..8.06 rows=1 width=10) Index Cond: (id = 1) (2 rows)
実行されるSQL文の実行計画を確認してください。 作成した仮想インデックスは、SQL文の実行計画では使用されません。
EXPLAIN ANALYZE SELECT val FROM hypo WHERE id = 1; QUERY PLAN --------------------------------------------------------------------------------------------------- Seq Scan on hypo (cost=0.00..1791.00 rows=1 width=10) (actual time=0.046..46.390 rows=1 loops=1) Filter: (id = 1) Rows Removed by Filter: 99999 Planning time: 0.160 ms Execution time: 46.460 ms (5 rows)
関連ドキュメント
HypoPGの詳細については、「HypoPGの使用方法」をご参照ください。