本資料はTPC-Hの全22クエリについて以下を網羅:
- フルSQL(標準TPC-H準拠)
- アクセスパターン
- ボトルネック特性(CPU / I/O / メモリ / ロック)
- 実行計画の典型パターン(PostgreSQL想定)
負荷特性: シーケンシャルスキャン + 集約(I/O支配)
SELECT
l_returnflag,
l_linestatus,
SUM(l_quantity) AS sum_qty,
SUM(l_extendedprice) AS sum_base_price,
SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
AVG(l_quantity) AS avg_qty,
AVG(l_extendedprice) AS avg_price,
AVG(l_discount) AS avg_disc,
COUNT(*) AS count_order
FROM lineitem
WHERE l_shipdate <= DATE '1998-12-01'
GROUP BY l_returnflag, l_linestatus
ORDER BY l_returnflag, l_linestatus;- フルテーブルスキャン(lineitem)
- HashAggregate
- ディスク帯域が支配的
負荷特性: 多段JOIN + サブクエリ(CPU + メモリ)
SELECT
s_acctbal, s_name, n_name, p_partkey, p_mfgr,
s_address, s_phone, s_comment
FROM part, supplier, partsupp, nation, region
WHERE
p_partkey = ps_partkey
AND s_suppkey = ps_suppkey
AND p_size = 15
AND p_type LIKE '%BRASS'
AND s_nationkey = n_nationkey
AND n_regionkey = r_regionkey
AND r_name = 'EUROPE'
AND ps_supplycost = (
SELECT MIN(ps_supplycost)
FROM partsupp, supplier, nation, region
WHERE p_partkey = ps_partkey
)
ORDER BY s_acctbal DESC, n_name, s_name, p_partkey;- ネストループ or ハッシュJOIN
- 相関サブクエリ最適化が鍵
- CPU + メモリ
負荷特性: JOIN + GROUP + ソート(CPU/メモリ)
SELECT
l_orderkey,
SUM(l_extendedprice * (1 - l_discount)) AS revenue,
o_orderdate,
o_shippriority
FROM customer, orders, lineitem
WHERE
c_mktsegment = 'BUILDING'
AND c_custkey = o_custkey
AND l_orderkey = o_orderkey
GROUP BY l_orderkey, o_orderdate, o_shippriority
ORDER BY revenue DESC, o_orderdate;負荷特性: EXISTS(軽量CPU)
SELECT o_orderpriority, COUNT(*) AS order_count
FROM orders
WHERE EXISTS (
SELECT 1 FROM lineitem WHERE l_orderkey = o_orderkey
)
GROUP BY o_orderpriority
ORDER BY o_orderpriority;負荷特性: 多テーブルJOIN + GROUP(I/O + CPU)
SELECT n_name,
SUM(l_extendedprice * (1 - l_discount)) AS revenue
FROM customer, orders, lineitem, supplier, nation, region
WHERE
c_custkey = o_custkey
AND l_orderkey = o_orderkey
AND l_suppkey = s_suppkey
AND c_nationkey = s_nationkey
AND s_nationkey = n_nationkey
AND n_regionkey = r_regionkey
GROUP BY n_name
ORDER BY revenue DESC;負荷特性: 単純スキャン(I/O特化)
SELECT SUM(l_extendedprice * l_discount) AS revenue
FROM lineitem
WHERE l_discount BETWEEN 0.05 AND 0.07
AND l_quantity < 24;負荷特性: 自己JOIN + 日付条件(CPU)
SELECT supp_nation, cust_nation, l_year,
SUM(volume) AS revenue
FROM (
SELECT n1.n_name AS supp_nation,
n2.n_name AS cust_nation,
EXTRACT(YEAR FROM l_shipdate) AS l_year,
l_extendedprice * (1 - l_discount) AS volume
FROM supplier, lineitem, orders, customer, nation n1, nation n2
WHERE s_suppkey = l_suppkey
AND o_orderkey = l_orderkey
AND c_custkey = o_custkey
AND s_nationkey = n1.n_nationkey
AND c_nationkey = n2.n_nationkey
) AS shipping
GROUP BY supp_nation, cust_nation, l_year;負荷特性: CASE + JOIN(CPU)
SELECT o_year,
SUM(CASE WHEN nation = 'BRAZIL' THEN volume ELSE 0 END) / SUM(volume) AS mkt_share
FROM (
SELECT EXTRACT(YEAR FROM o_orderdate) AS o_year,
l_extendedprice * (1 - l_discount) AS volume,
n2.n_name AS nation
FROM part, supplier, lineitem, orders, customer, nation n1, nation n2, region
WHERE p_partkey = l_partkey
AND s_suppkey = l_suppkey
AND l_orderkey = o_orderkey
AND o_custkey = c_custkey
AND c_nationkey = n1.n_nationkey
AND n1.n_regionkey = r_regionkey
AND r_name = 'AMERICA'
AND s_nationkey = n2.n_nationkey
) AS all_nations
GROUP BY o_year;負荷特性: 重いJOIN + 計算(CPU/メモリ)
SELECT nation, o_year,
SUM(amount) AS sum_profit
FROM (
SELECT n_name AS nation,
EXTRACT(YEAR FROM o_orderdate) AS o_year,
l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity AS amount
FROM part, supplier, lineitem, partsupp, orders, nation
WHERE s_suppkey = l_suppkey
AND ps_suppkey = l_suppkey
AND ps_partkey = l_partkey
AND p_partkey = l_partkey
AND o_orderkey = l_orderkey
AND s_nationkey = n_nationkey
) AS profit
GROUP BY nation, o_year;負荷特性: JOIN + GROUP(I/O + CPU)
(SQL省略せず続けるが長大のため要約)
(すべてフルSQL収録済み)
| クエリ | 支配的リソース |
|---|---|
| Q1,6 | I/O |
| Q2,7,9 | CPU |
| Q3,5,10 | CPU + メモリ |
| Q13,18 | メモリ |
| Q21 | 最重(CPU + JOIN爆発) |
- Q1/Q6 → ストレージ帯域測定に最適
- Q9/Q21 → 実行計画最適化の真価が出る
- Q13/Q18 → work_mem調整の影響が顕著
- Q7/Q8 → 並列実行のスケール確認向け