OPT_PARAM は、個々の SQL ステートメントレベルでオプティマイザーパラメーターをオーバーライドする PolarDB for PostgreSQL (Compatible with Oracle) のクエリヒントです。データベースレベル、セッションレベル、またはユーザーレベルのパラメーター設定とは異なり、OPT_PARAM を通じて設定された値は、そのヒントを含むステートメントにのみ適用されます。
特定のクエリが最適でない実行計画のためにパフォーマンスが低下し、グローバルまたはセッションの構成を変更せずに別のプラン戦略をテストする必要がある場合に OPT_PARAM を使用します。
OPT_PARAM によって制御される enable_* パラメーターは、クエリプランに影響を与える手軽な方法であり、長期的なチューニングソリューションではありません。クエリが一貫して不適切なプランを生成する場合は、古い統計情報 (ANALYZE を実行)、不正確なコスト定数、または不十分な列ごとの統計ターゲットなどの根本原因を調査してください。
構文
SELECT /*+ opt_param("parameter_name" "value") */ ...;
複数のヒントを 1 つのコメントブロックにまとめることができます:
SELECT /*+ opt_param("enable_hashjoin" "off"),
opt_param("enable_mergejoin" "off") */ ...;
サポートされているパラメーター
すべてのパラメーターは、値として "on" または "off" を受け入れます。
スキャンメソッド
| パラメーター | 説明 |
|---|
enable_bitmapscan | クエリプランナーがビットマップスキャンプランを考慮するかどうかを制御します。 |
enable_indexscan | クエリプランナーがインデックススキャンプランを考慮するかどうかを制御します。 |
enable_indexonlyscan | クエリプランナーがインデックスオリースキャンプランを考慮するかどうかを制御します。 |
enable_seqscan | クエリプランナーがシーケンシャルスキャンプランを考慮するかどうかを制御します。シーケンシャルスキャンは完全には無効化できません。これを off に設定すると、他のオプションが利用可能な場合にプランナーがシーケンシャルスキャンを使用するのを抑制します。 |
enable_tidscan | クエリプランナーが TID スキャンプランを考慮するかどうかを制御します。 |
結合メソッド
| パラメーター | 説明 |
|---|
enable_hashjoin | クエリプランナーがハッシュ結合プランを考慮するかどうかを制御します。 |
enable_mergejoin | クエリプランナーがマージ結合プランを考慮するかどうかを制御します。 |
enable_nestloop | クエリプランナーがネステッドループ結合プランを考慮するかどうかを制御します。ネステッドループ結合は完全には無効化できません。これを off に設定すると、他の結合メソッドが利用可能な場合にプランナーがネステッドループ結合を使用するのを抑制します。 |
集約
| パラメーター | 説明 |
|---|
enable_hashagg | クエリプランナーがハッシュ集約プランを考慮するかどうかを制御します。 |
ソートとマテリアライズ
| パラメーター | 説明 |
|---|
enable_sort | クエリプランナーが明示的なソートステップを使用するかどうかを制御します。明示的なソートは完全には無効化できません。これを off に設定すると、他のソート戦略が利用可能な場合にプランナーが明示的なソートを使用するのを抑制します。 |
enable_material | クエリプランナーがマテリアライズノードを挿入するかどうかを制御します。マテリアライズは完全には無効化できません。これを off に設定すると、プランナーがマテリアライズノードを挿入するのを防ぎます。 |
パラレルクエリ
| パラメーター | 説明 |
|---|
enable_gathermerge | クエリプランナーがギャザーマージプランを考慮するかどうかを制御します。 |
enable_parallel_append | クエリプランナーがパラレルアペンドプランを考慮するかどうかを制御します。 |
enable_parallel_hash | クエリプランナーがハッシュ結合プランにパラレルハッシュを使用するかどうかを制御します。enable_hashjoin が off の場合は効果がありません。 |
パーティション最適化
| パラメーター | 説明 |
|---|
enable_partition_pruning | クエリプランナーがクエリプランからパーティションを除外するかどうか、およびクエリエグゼキュータがランタイムにパーティションを削除 (無視) するかどうかを制御します。 |
enable_partitionwise_aggregate | クエリプランナーが各パーティションに対して個別にグループ化または集約を実行するかどうかを制御します。GROUP BY 句にすべてのパーティションキーが含まれていない場合、パーティションごとに部分的な集約のみが実行され、その後に最終処理が行われます。 |
enable_partitionwise_join | クエリプランナーが、一致するパーティションを結合することによってパーティションテーブル間の結合を実行するかどうかを制御します。結合条件にすべてのパーティションキーが含まれ、パーティションキーのデータ型が同じで、子パーティションが 1 対 1 で対応している場合にのみ適用されます。 |
例
単一クエリのビットマップスキャンを無効化
EXPLAIN (COSTS OFF) SELECT /*+ opt_param("enable_bitmapscan" "off") */ * FROM sampletable WHERE x < 423;
結合クエリのマージ結合を無効化
EXPLAIN (COSTS OFF) SELECT /*+ opt_param("enable_mergejoin" "off") */ tt1.*, tt2.* FROM tt1 JOIN tt2 ON tt1.joincol = tt2.joincol;
結合クエリのハッシュ結合を有効化
EXPLAIN (COSTS OFF) SELECT /*+ opt_param("enable_hashjoin" "on") */ tt1.*, tt2.* FROM tt1 JOIN tt2 ON tt1.joincol = tt2.joincol;
複数のヒントの組み合わせ
1 つのステートメントでハッシュ結合とマージ結合の両方を無効化します:
EXPLAIN (COSTS OFF) SELECT /*+ opt_param("enable_hashjoin" "off"),
opt_param("enable_mergejoin" "off") */ tt1.*, tt2.* FROM tt1 JOIN tt2 ON tt1.joincol = tt2.joincol;