hypopg拡張機能は、インデックスの種類が1つ以上のクエリを高速化するかどうかを確認するのに役立ちます。
前提条件
hypopgエクステンションを使用する前に、次の問題を確認する必要があります。
最適化する必要があるクエリ。
使用するインデックスタイプ。
この拡張機能は、次のエンジンを実行するPolarDB for PostgreSQL (Compatible with Oracle) クラスターでサポートされています。
PolarDB for PostgreSQL (Oracle互換) 2.0 (バージョン2.0.14.1.0以降)
PolarDB for PostgreSQL (Oracle互換) 1.0 (バージョン1.1.28以降)
説明次のいずれかのステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのリビジョンバージョンを表示できます。
SHOW polar_version;
概要
hypopgは、 PolarDB for PostgreSQL (Oracle互換) でサポートされているオープンソースのサードパーティ拡張機能です。 hypopg拡張によって作成された仮想インデックスは、どのシステムテーブルにも存在しませんが、接続先のプライベートメモリに格納されます。 hypopg拡張機能は、仮想インデックスが実際には物理ファイルに存在しないため、仮想インデックスがEXPLAINステートメント (ANALYZEオプションを除く) で使用されるようにします。 仮想インデックスは実際には存在せず、CPUやディスクなどのリソースを消費しません。
hypopg拡張機能は、次のタイプのインデックスをサポートします。
btree: B-treeインデックス。
brin: ブロック範囲インデックス
hash: ハッシュインデックス。
bloom: ブルーム指数。 最初にbloomエクステンションをインストールする必要があります。
使用量
hypopg拡張機能をインストールします。
hypopg拡張機能をインストールします。
CREATE EXTENSION hypopg;hypopg拡張機能がインストールされているかどうかを確認します。
\dx hypopgサンプル結果:
List of installed extensions Name | Version | Schema | Description --------+---------+--------+------------------------------------- hypopg | 1.3.1 | public | Hypothetical indexes for PostgreSQL (1 row)説明上記の結果は、hypopg 1.3.1がインストールされていることを示します。
SQL文を実行してpg_extensionテーブルを照会し、hypopg拡張がインストールされているかどうかを確認することもできます。 例:
SELECT * FROM pg_extension WHERE extname = 'hypopg';サンプル結果:
extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition ---------+----------+--------------+----------------+------------+-----------+-------------- hypopg | 10 | 2200 | t | 1.3.1 | | (1 row)
パラメーターを設定します。
パラメーター
説明
hypopg.enabled
hypopg拡張を有効にするかどうかを指定します。 デフォルト値 : on。 有効な値:
on
off
説明hypopg拡張機能を無効にすると、仮想インデックスは使用されませんが、既存の仮想インデックスは削除されません。
hypopg.us e_real_oids
実オブジェクト識別子 (OID) を使用するかどうかを指定します。 デフォルト値:off 有効な値:
off: 実際のOIDを使用しません。 代わりに、IDはアイドルID範囲から選択される。 このようなIDは、将来のリリースで使用するためにデータベースによって予約されます。 アイドルID範囲はhypopg拡張が最初に使用されるときに動的に計算され、セカンダリサーバーで使用できるため、これでは問題は発生しません。
説明ただし、このパラメーターをoffに設定すると、合計で約2500の仮想インデックスが存在できます。 最大数に達すると、新しい仮想インデックスを作成するのに非常に長い時間がかかります。 この場合、この問題を解決するには、
hypopg_reset()関数を呼び出す必要があります。 詳細については、「仮想インデックス操作」をご参照ください。on: 実際のOIDを使用します。 hypopg.us e_real_oidsは、仮想インデックスの最大数に達したときに新しい仮想インデックスを作成するのに非常に長い時間がかかるという問題を防ぐために使用されます。 hypopgは実際のOIDを要求します。 これにより、より多くのロックリソースが必要になり、セカンダリサーバーで実際のOIDを使用できません。 ただし、すべてのOIDを使用できます。 詳細については、「仮想インデックス操作」をご参照ください。
説明このパラメーターの状態を変更しても、仮想インデックスのOIDはリセットされません。 実OIDと非実OIDは共存することができます。
hypopg拡張子を削除します。
DROP 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;クエリが高速化されているかどうかを確認します。 例:
EXPLAIN SELECT val FROM hypo WHERE id = 1;サンプル結果:
QUERY PLAN -------------------------------------------------------- Seq Scan on hypo (cost=0.00..1791.00 rows=1 width=10) Filter: (id = 1) (2 rows)説明ハイポテーブルにインデックスが含まれていないため、シーケンシャルスキャンは単純なクエリで使用されます。
テーブルに仮想インデックスを作成します。 例:
SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)') ;サンプル結果:
indexrelid | indexname ------------+---------------------- 13925 | <13925>btree_hypo_id (1 row)下表に、各パラメーターを説明します。
パラメーター
説明
13925
仮想インデックスのOID。
<13925>btree_hypo_id
仮想インデックスの名前。
説明id列の単純なBツリーインデックスは、このクエリを高速化します。
hypopg_create_index()関数は、標準のCREATE INDEXステートメントを受け取り (関数に渡される他のステートメントは無視されます) 、各ステートメントの仮想インデックスを作成します。OIDは動的に生成される。 この例では13925です。
EXPLAINステートメントを実行して、データベースがインデックスを使用しているかどうかを確認します。 例:
EXPLAIN SELECT val FROM hypo WHERE id = 1;サンプル結果:
QUERY PLAN ------------------------------------------------------------------------------------ Index Scan using "<13925>btree_hypo_id" on hypo (cost=0.04..8.06 rows=1 width=10) Index Cond: (id = 1) (2 rows)説明データベースはインデックスを使用します。
EXPLAINステートメントを実行して、ステートメントの実行時にデータベースが仮想インデックスを使用するかどうかを確認します。 例:
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.030..15.439 rows=1 loops=1) Filter: (id = 1) Rows Removed by Filter: 99999 Planning Time: 0.066 ms Execution Time: 15.492 ms (5 rows)説明ステートメントの実行時にデータベースが仮想インデックスを使用しているかどうかを確認します。
仮想インデックス操作
hypopgエクステンションは、便利な機能とビューも提供します。
hypopg_list_indexesビュー: 既存のすべての仮想インデックスを一覧表示します。 例:
SELECT * FROM hypopg_list_indexes ;サンプル結果:
indexrelid | index_name | schema_name | table_name | am_name ------------+----------------------+-------------+------------+--------- 13925 | <13925>btree_hypo_id | public | hypo | btree (1 row)hypopg() 関数: 既存のすべての仮想インデックスをpg_indexと同じ形式でリストします。 例:
SELECT * FROM hypopg() ;サンプル結果:
indexname | indexrelid | indrelid | innatts | indisunique | indkey | indcollation | indclass | indoption | indexprs | indpred | amid ----------------------+------------+----------+---------+-------------+--------+--------------+----------+-----------+----------+---------+------ <13925>btree_hypo_id | 13925 | 16450 | 1 | f | 1 | 0 | 1978 | | | | 403 (1 row)hypopg_get_indexdef(oid) 関数: 仮想インデックスのoidを使用して、実際のCREATE INDEXステートメントを取得します。 例:
SELECT index_name, hypopg_get_indexdef(indexrelid) FROM hypopg_list_indexes ;サンプル結果:
index_name | hypopg_get_indexdef ----------------------+---------------------------------------------- <13925>btree_hypo_id | CREATE INDEX ON public.hypo USING btree (id) (1 row)hypopg_relation_size(oid) 関数: 仮想インデックスのサイズを推定します。 例:
SELECT index_name, pg_size_pretty(hypopg_relation_size(indexrelid)) FROM hypopg_list_indexes ;サンプル結果:
index_name | pg_size_pretty ----------------------+---------------- <13925>btree_hypo_id | 2544 kB (1 row)hypopg_drop_index(oid) 関数: 指定されたOIDを持つ仮想インデックスを削除します。 例:
SELECT hypopg_drop_index(13925);サンプル結果:
hypopg_drop_index ------------------- t (1 row)hypopg_reset() 関数: すべての仮想インデックスを削除します。 例:
SELECT hypopg_reset();サンプル結果:
hypopg_reset -------------- (1 row)