ヒントは、SQL 文で参照されるテーブルで使用されています。 ヒントは、ビューが SQL 文で参照される場合、ビューに表示されるテーブルでも使用できます。 ヒントはビューには表示されません。 代わりに、ビューを参照する SQL 文にヒントが表示されます。
ビュー内のテーブルでヒントを指定する場合は、ヒント引数リスト内にドット表記でビュー名とテーブル名を提供します。
概要
hint(view.table)
パラメーター
パラメーター | 説明 |
---|---|
hint | 表 1 または表 2 のヒントのいずれか。 |
view | テーブルを含むビューの名前。 |
table | ヒントが使用されるテーブル。 |
例
tx という名前のビューは、pgbench_history、pgbench_branches、および pgbench_accounts の 3 つのテーブルを結合して作成されます。 結合関係のヒントの最後の例このビューを示しています。
CREATE VIEW tx AS SELECT h.mtime, h.delta, b.bid, a.aid FROM pgbench_history h, pgbench_branches b, pgbench_accounts a WHERE h.bid = b.bid AND h.aid = a.aid;
次の例は、このビューによって生成されたクエリプランを示しています。
EXPLAIN SELECT * FROM tx;
QUERY PLAN
----------------------------------------------------------------------------------------
Hash Join (cost=86814.29..123103.29 rows=500000 width=20)
Hash Cond: (h.aid = a.aid)
-> Hash Join (cost=21.45..15081.45 rows=500000 width=20)
Hash Cond: (h.bid = b.bid)
-> Seq Scan on pgbench_history h (cost=0.00..8185.00 rows=500000 width=20)
-> Hash (cost=21.20..21.20 rows=20 width=4)
-> Seq Scan on pgbench_branches b (cost=0.00..21.20 rows=20 width=4)
-> Hash (cost=53746.15..53746.15 rows=2014215 width=4)
-> Seq Scan on pgbench_accounts a (cost=0.00..53746.15 rows=2014215 width=4)
(9 rows)
この結合の結合関係のヒントの最後で使用されているヒントは、ビューで使用できます。 次の例は、この使用法を示しています。
EXPLAIN SELECT /*+ USE_MERGE(tx.h tx.b) USE_HASH(tx.a) */ * FROM tx;
QUERY PLAN
--------------------------------------------------------------------------------------------------
Hash Join (cost=152583.39..182562.49 rows=500000 width=20)
Hash Cond: (h.aid = a.aid)
-> Merge Join (cost=65790.55..74540.65 rows=500000 width=20)
Merge Cond: (b.bid = h.bid)
-> Sort (cost=21.63..21.68 rows=20 width=4)
Sort Key: b.bid
-> Seq Scan on pgbench_branches b (cost=0.00..21.20 rows=20 width=4)
-> Materialize (cost=65768.92..68268.92 rows=500000 width=20)
-> Sort (cost=65768.92..67018.92 rows=500000 width=20)
Sort Key: h.bid
-> Seq Scan on pgbench_history h (cost=0.00..8185.00 rows=500000 width=20)
-> Hash (cost=53746.15..53746.15 rows=2014215 width=4)
-> Seq Scan on pgbench_accounts a (cost=0.00..53746.15 rows=2014215 width=4)
(13 rows)
サブクエリのテーブルでヒントを使用することもできます。 次の例は、この使用方法を示しています。 サンプルアプリケーションの emp テーブルにクエリを実行すると、emp テーブルは、エイリアス b で識別される emp テーブルのサブクエリと結合され、従業員とそのマネージャがリストされます。
SELECT a.empno, a.ename, b.empno "mgr empno", b.ename "mgr ename" FROM emp a, (SELECT * FROM emp) b WHERE a.mgr = b.empno;
empno | ename | mgr empno | mgr ename
-------+--------+-----------+-----------
7369 | SMITH | 7902 | FORD
7499 | ALLEN | 7698 | BLAKE
7521 | WARD | 7698 | BLAKE
7566 | JONES | 7839 | KING
7654 | MARTIN | 7698 | BLAKE
7698 | BLAKE | 7839 | KING
7782 | CLARK | 7839 | KING
7788 | SCOTT | 7566 | JONES
7844 | TURNER | 7698 | BLAKE
7876 | ADAMS | 7788 | SCOTT
7900 | JAMES | 7698 | BLAKE
7902 | FORD | 7566 | JONES
7934 | MILLER | 7782 | CLARK
(13 rows)
次の例は、クエリプランナーが選択したプランを示しています。
EXPLAIN SELECT a.empno, a.ename, b.empno "mgr empno", b.ename "mgr ename" FROM emp a, (SELECT * FROM emp) b WHERE a.mgr = b.empno;
QUERY PLAN
-----------------------------------------------------------------
Hash Join (cost=1.32..2.64 rows=13 width=22)
Hash Cond: (a.mgr = emp.empno)
-> Seq Scan on emp a (cost=0.00..1.14 rows=14 width=16)
-> Hash (cost=1.14..1.14 rows=14 width=11)
-> Seq Scan on emp (cost=0.00..1.14 rows=14 width=11)
(5 rows)
ヒントをサブクエリ内の emp テーブルで使用して、emp_pk インデックスのテーブルスキャンの代わりにインデックススキャンを実行できます。 クエリプランが変更されます。
EXPLAIN SELECT /*+ INDEX(b.emp emp_pk) */ a.empno, a.ename, b.empno "mgr empno", b.ename "mgr ename" FROM emp a, (SELECT * FROM emp) b WHERE a.mgr = b.empno;
QUERY PLAN
---------------------------------------------------------------------------
Merge Join (cost=4.17..13.11 rows=13 width=22)
Merge Cond: (a.mgr = emp.empno)
-> Sort (cost=1.41..1.44 rows=14 width=16)
Sort Key: a.mgr
-> Seq Scan on emp a (cost=0.00..1.14 rows=14 width=16)
-> Index Scan using emp_pk on emp (cost=0.14..12.35 rows=14 width=11)
(6 rows)