このトピックでは、アクセス方法のヒントについて説明します。
構文
次のヒントは、オプティマイザがリレーションにアクセスして結果セットを作成する方法を決定するものです。
ヒント | 説明 |
FULL(table) | テーブルに対してフルシーケンシャルスキャンを実行します。 |
INDEX(table [ index ] [...]) | リレーションにアクセスするためにテーブルのインデックスを使用します。 |
NO_INDEX(table [ index ] [...]) | リレーションにアクセスするためにテーブルのインデックスを使用しません。 |
さらに、デフォルト最適化モードのALL_ROWS、FIRST_ROWS、およびFIRST_ROWS(n) ヒントを使用できます。
例:
基本データを準備します。 サンプルアプリケーションには、オプティマイザのヒントの効果を説明するのに十分なデータがありません。 したがって、このセクションの残りの例では、pgbenchアプリケーションによって作成された銀行データベースを使用します。
Linux ECS インスタンスを作成します。 この例のECSインスタンスは、CentOS 7.3 64ビットオペレーティングシステムを実行します。 詳細については、「カスタム起動タブでインスタンスを作成する」をご参照ください。
説明PolarDBクラスターと同じゾーンおよび仮想プライベートクラウド (VPC) にECSインスタンスを作成することを推奨します。
ECSインスタンスにPostgreSQLクライアントをインストールします。 詳細については、「PostgreSQL公式ドキュメント」をご参照ください。
説明インストールするPostgreSQLクライアントのバージョンが、接続するPolarDB for PostgreSQL (compatible with Oracle) クラスターのバージョンと互換性があることを確認します。
特権アカウントを作成します。 詳細については、「データベースアカウントの作成」をご参照ください。
クラスターエンドポイントを取得します。 詳細については、「エンドポイントの表示または申請」をご参照ください。
PolarDBクラスターとECSインスタンスが同じゾーンにある場合は、内部エンドポイントを使用します。 それ以外の場合は、パブリックエンドポイントを申請してください。 ECSインスタンスのIPアドレスをPolarDBクラスターのホワイトリストに追加します。 詳細については、「クラスターのホワイトリストの設定」をご参照ください。
コンソールで銀行データベースを作成します。 詳細については、「データベース管理」をご参照ください。
ECSインスタンスのクライアントを使用して次のコマンドを実行し、pgbench_accounts、pgbench_branches、pgbench_tellers、およびpgbench_historyテーブルによって銀行のデータベースを設定します。
pgbench -h <PolarDB cluster endpoint> -p <port of PolarDB cluster endpoint> -i -s 20 -U <PolarDB database username> bank
-s 20オプションは、スケーリング係数を20として指定します。 この係数により、20 個の支店を作成できます。 各支店には 100,000 個の銀行口座があります。 したがって、pgbench_accounts テーブルに合計 2,000,000 行生成され、pgbench_branches テーブルに 20 行生成されます。 各支店には 10 人の出納係が割り当てられています。 結果として、pgbench_tellers テーブルに合計 200 行生成されます。
合計 500,000 個のトランザクションが処理されます。 したがって、pgbench_history テーブルに 500,000 行追加されます。
pgbench -h <PolarDB cluster endpoint> -p <port of PolarDB cluster endpoint> -t 500000 -U <PolarDB database username> bank
PostgreSQLクライアントで次のコマンドを実行して、テーブルスキーマを照会します。 他のツールを使用してスキーマをクエリできます。 DMSを使用してテーブルスキーマをクエリする方法の詳細については、「スキーマのクエリと変更」をご参照ください。
\d pgbench_accounts Table "public.pgbench_accounts" Column | Type | Modifiers ----------+---------------+----------- aid | integer | not null bid | integer | abalance | integer | filler | character(84) | Indexes: "pgbench_accounts_pkey" PRIMARY KEY, btree (aid) \d pgbench_branches Table "public.pgbench_branches" Column | Type | Modifiers ----------+---------------+----------- bid | integer | not null bbalance | integer | filler | character(88) | Indexes: "pgbench_branches_pkey" PRIMARY KEY, btree (bid) \d pgbench_tellers Table "public.pgbench_tellers" Column | Type | Modifiers ----------+---------------+----------- tid | integer | not null bid | integer | tbalance | integer | filler | character(84) | Indexes: "pgbench_tellers_pkey" PRIMARY KEY, btree (tid) \d pgbench_history Table "public.pgbench_history" Column | Type | Modifiers --------+-----------------------------+----------- tid | integer | bid | integer | aid | integer | delta | integer | mtime | timestamp without time zone | filler | character(22) |
次のクエリを実行します。
EXPLAINコマンドは、クエリプランナーによって選択されたプランを示します。 次の例では、aid が主キー列です。 インデックス付き検索は、pgbench_accounts_pkey インデックスで使用されます。
EXPLAIN SELECT * FROM pgbench_accounts WHERE aid = 100;
次の応答が返されます。
QUERY PLAN ----------------------------------------------------------------------------------------------- Index Scan using pgbench_accounts_pkey on pgbench_accounts (cost=0.43..8.45 rows=1 width=97) Index Cond: (aid = 100) (2 rows)
次の例では、FULL ヒントを使用して強制的にフルシーケンシャルスキャンを実行します。 インデックスは使用しません。
EXPLAIN SELECT /*+ FULL(pgbench_accounts) */ * FROM pgbench_accounts WHERE aid = 100;
次の応答が返されます。
QUERY PLAN --------------------------------------------------------------------- Seq Scan on pgbench_accounts (cost=0.00..58781.69 rows=1 width=97) Filter: (aid = 100) (2 rows)
次の例では、NO_INDEXヒントを使用して、並列順次スキャンを強制します。 インデックスは使用しません。
EXPLAIN SELECT /*+ NO_INDEX(pgbench_accounts pgbench_accounts_pkey) */ * FROM pgbench_accounts WHERE aid = 100;
次の応答が返されます。
QUERY PLAN ------------------------------------------------------------------------------------ Gather (cost=1000.00..45094.80 rows=1 width=97) Workers Planned: 2 -> Parallel Seq Scan on pgbench_accounts (cost=0.00..44094.70 rows=1 width=97) Filter: (aid = 100) (4 rows)
上記の例のEXPLAINコマンドに加えて、trace_hints設定パラメーターを指定して、プランナでヒントが使用されているかどうかに関するより詳細な情報を取得できます。
SET trace_hints TO on;
次の例では、NO_INDEXヒントを持つSELECTコマンドを繰り返して、trace_hints設定パラメーターを指定した後に生成される追加情報を示します。
EXPLAIN SELECT /*+ NO_INDEX(pgbench_accounts pgbench_accounts_pkey) */ * FROM pgbench_accounts WHERE aid = 100;
次の応答が返されます。
INFO: [HINTS] Index Scan of [pgbench_accounts].[pgbench_accounts_pkey] rejected due to NO_INDEX hint. QUERY PLAN ------------------------------------------------------------------------------------ Gather (cost=1000.00..45094.80 rows=1 width=97) Workers Planned: 2 -> Parallel Seq Scan on pgbench_accounts (cost=0.00..44094.70 rows=1 width=97) Filter: (aid = 100) (4 rows)
ヒントを無視すると、INFO: [HINTS] 行は表示されません。 これは、ヒントに構文エラーまたはスペルエラーが存在することを表している可能性があります。 次の例は、インデックス名のスペルが間違っていることを示しています。
EXPLAIN SELECT /*+ NO_INDEX(pgbench_accounts pgbench_accounts_xxx) */ * FROM pgbench_accounts WHERE aid = 100;
次の応答が返されます。
QUERY PLAN ----------------------------------------------------------------------------------------------- Index Scan using pgbench_accounts_pkey on pgbench_accounts (cost=0.43..8.45 rows=1 width=97) Index Cond: (aid = 100) (2 rows)