Amazon Redshift RGインスタンス vs RA3インスタンス - クラスタのパフォーマンス・コストを TPC-H 10GB で比較してみた
クラウド事業本部の石川です。5/14にAmazon Redshift の新世代 RG インスタンス(Graviton ベース)が発表されました。本日は、新世代 RG インスタンス(Graviton ベース)と従来の RA3 インスタンスの性能差を、TPC-H 10GB を使って実測比較してみました。
2026 年 5 月、AWS は Amazon Redshift の新しいコンピュートノードとして RG インスタンス(AWS Graviton ベース、データレイククエリエンジン統合)をリリースしました。AWS 公式ブログでは、従来の RA3 インスタンスに対して以下の性能・コスト改善が公表されています。
| 比較項目 | RG の公称値(RA3 比) |
|---|---|
| データウェアハウスワークロード | 最大 2.2 倍 |
| Apache Iceberg クエリ | 最大 2.4 倍 |
| Apache Parquet クエリ | 最大 1.5 倍 |
| vCPU 単価 | 30% 削減 |
これらは理想条件下のピーク値であり、実ワークロードでの再現性は自社で検証する必要があります。今回は、rg.xlarge × 2 ノード と ra3.xlplus × 2 ノード の両クラスタを us-east-1 に用意し、TPC-H 10GB のローカルテーブルに対する 22 クエリのレイテンシを 2 時間枠で実測しました。
最初に結論
rg.xlarge × 2 と ra3.xlplus × 2 を us-east-1 にて TPC-H 10GB で比較した結果、以下が確認できました。
- クエリレイテンシ: 22 クエリ speedup 中央値 1.51 倍(合計 7.52 秒 → 11.26 秒)
- コスト効率(東京リージョン単価で試算): 同一ワークロードでの円 / クエリ比 0.47(rg が約 53% 安い)
- COPY ロード性能: 8 表合計 speedup 1.38 倍(83 秒 → 114 秒)
検証環境
| 項目 | RG クラスタ(rg2) | RA3 クラスタ(xlplus2) |
|---|---|---|
| インスタンスタイプ | rg.xlarge |
ra3.xlplus |
| ノード数 | 2 | 2 |
| vCPU / ノード | 4 | 4 |
| メモリ / ノード | 32 GB | 32 GB |
| ストレージ | Redshift Managed Storage | Redshift Managed Storage |
| リージョン | us-east-1 | us-east-1 |
| 対象スキーマ | tpch10g |
tpch10g |
| パラメータグループ | default.redshift-2.0 |
default.redshift-2.0 |
rg.xlarge と ra3.xlplus は vCPU・メモリのスペック上は同一です。RG は AWS Graviton ベースで「データウェアハウスとデータレイクの統合クエリエンジン」を内蔵している点が大きな違いになります。
両クラスタには事前に AWS Labs CloudDataWarehouseBenchmark の TPC-H 10GB データ(8 表・約 8,659 万行)を COPY 済みです。
やってみた
検証は次の流れで進めました。
前提条件
- 両クラスタは
available状態、TPC-H 10GB をtpch10gスキーマに COPY 済み - リージョン: us-east-1
- 接続: Redshift Data API(
batch-execute-statement/describe-statement) - 計測 PC: MacBook
検証準備: 両クラスタの状態を揃える
クエリ性能比較で大きく結果が変わる要素として、(1) データ件数と統計情報、(2) Result Cache、(3) Concurrency Scaling、(4) search_path の差分があります。それぞれ次のように揃えました。
件数照合と統計情報の更新
両クラスタで TPC-H 8 表の件数を取得して完全一致を確認し、ANALYZE を再実行して統計情報を最新化します。結果は両クラスタ完全一致でした。
| テーブル | 件数 |
|---|---|
| region | 5 |
| nation | 25 |
| supplier | 100,000 |
| customer | 1,500,000 |
| part | 2,000,000 |
| partsupp | 8,000,000 |
| orders | 15,000,000 |
| lineitem | 59,986,052 |
| 合計 | 約 8,659 万行 |
続けて、両クラスタで全 8 表に ANALYZE を実行します。execute-statement は単一 SQL しか受け付けないので、batch-execute-statement で複数文を 1 リクエストにまとめます。
for CLUSTER in rg2 xlplus2; do
aws redshift-data batch-execute-statement \
--cluster-identifier ${CLUSTER} --database dev --db-user awsuser \
--region us-east-1 \
--sqls "ANALYZE tpch10g.region" "ANALYZE tpch10g.nation" \
"ANALYZE tpch10g.supplier" "ANALYZE tpch10g.customer" \
"ANALYZE tpch10g.part" "ANALYZE tpch10g.partsupp" \
"ANALYZE tpch10g.orders" "ANALYZE tpch10g.lineitem"
done
テーブル分散状況の比較
SVV_TABLE_INFO でテーブルの圧縮後サイズ・分散キー・スキューが両クラスタで揃っているか確認します。
aws redshift-data execute-statement \
--cluster-identifier rg2 --database dev --db-user awsuser --region us-east-1 \
--sql "SELECT \"table\", size, tbl_rows, skew_rows, sortkey1, diststyle
FROM svv_table_info WHERE schema='tpch10g' ORDER BY \"table\""
両クラスタとも size / tbl_rows / diststyle / sortkey1 まで完全に一致しました(AUTO(ENCODE) で同じ列圧縮、KEY 分散も同一)。
| テーブル | size (MB) | dist key | sort key |
|---|---|---|---|
| region | 36 | KEY(r_regionkey) | r_regionkey |
| nation | 56 | KEY(n_nationkey) | n_nationkey |
| supplier | 80 | KEY(s_suppkey) | s_suppkey |
| part | 176 | KEY(p_partkey) | p_partkey |
| customer | 200 | KEY(c_custkey) | c_custkey |
| partsupp | 532 | KEY(ps_partkey) | ps_partkey |
| orders | 768 | KEY(o_orderkey) | o_orderdate |
| lineitem | 2,765 | KEY(l_orderkey) | l_shipdate |
Result Cache の無効化と search_path 設定
クエリ性能の素の値を比較するには Result Cache を確実に無効化する必要があります。Redshift Data API は execute-statement で SET ...; SELECT ... のような複数文を送ると先頭の SET だけを処理してしまうため、後述するベンチマークスクリプトでは batch-execute-statement で SET enable_result_cache_for_session = OFF と TPC-H クエリを 1 セッション内で続けて実行する形にしました。
また、tpch10g スキーマに修飾なしでアクセスできるよう、awsuser の search_path を両クラスタに永続設定します。
for CLUSTER in rg2 xlplus2; do
aws redshift-data execute-statement \
--cluster-identifier ${CLUSTER} --database dev --db-user awsuser \
--region us-east-1 \
--sql "ALTER USER awsuser SET search_path = tpch10g, public"
done
シナリオ①: COPY ロード性能
クラスタ作成時に取得済みの 2 件の evidence/<run_id>/copy_durations.tsv を引用し、テーブル別のロード時間を比較します。duration_ms は aws redshift-data describe-statement --query Duration が返す値(ナノ秒)を ms に換算したものです。
| テーブル | rg2 duration (ms) | xlplus2 duration (ms) | speedup (xlplus2 / rg2) |
|---|---|---|---|
| region | 563 | 1,060 | 1.88 |
| nation | 591 | 983 | 1.66 |
| supplier | 1,006 | 1,413 | 1.40 |
| customer | 2,567 | 3,299 | 1.29 |
| part | 2,457 | 3,237 | 1.32 |
| partsupp | 8,480 | 11,003 | 1.30 |
| orders | 12,713 | 16,754 | 1.32 |
| lineitem | 54,557 | 76,429 | 1.40 |
| 合計 | 82,934(約 83.0 秒) | 114,178(約 114.2 秒) | 約 1.38 |
8 表の合計ロード時間は rg2 が約 83 秒、xlplus2 が約 114 秒で、RG が 約 1.38 倍速く ロードを完了しました。特に最大テーブルの lineitem(約 6,000 万行 / 2.7GB)は 54.6 秒 vs 76.4 秒で、Graviton + 統合 I/O エンジンが大きなテーブルでも安定して効いている印象です。
小さい region / nation は speedup 倍率が大きく見えますが、絶対値が ms オーダーなので解釈には注意が必要です。
シナリオ②: TPC-H 22 クエリのレイテンシ計測
対象クエリ(TPC-H 22 クエリ全本)
TPC-H 10GB はサイズが小さく、22 クエリ × 3 回 × 2 クラスタ = 132 実行でも 60 分以内に収まる見込みのため、標準 22 クエリを全本対象とする。短/中/長の時間レンジ・JOIN/集約/サブクエリ/Window/CASE のすべての特性をカバーできる。
| Q# | 時間カテゴリ | 主特性 | 期待される RG の効きどころ |
|---|---|---|---|
| Q1 | 短 | lineitem 単表大集約 | CPU / I/O |
| Q2 | 中 | 多表結合 + サブクエリ | オプティマイザ |
| Q3 | 短 | 3 表結合 + 集約 | CPU |
| Q4 | 短 | 半結合 EXISTS | サブクエリ最適化 |
| Q5 | 中 | 6 表結合 + 年次集約 | 再分散 |
| Q6 | 短 | 単表 lineitem + 範囲述語 | I/O / pruning |
| Q7 | 中 | 7 表結合 + 年次集約 | JOIN 順序 |
| Q8 | 中 | 8 表結合 + 比率算出 | 集約 + 結合 |
| Q9 | 長 | 6 表結合 + 大集約 | CPU / I/O |
| Q10 | 中 | 4 表結合 + Top-N | ソート |
| Q11 | 中 | サブクエリ + GROUP BY HAVING | 集約 |
| Q12 | 短 | lineitem + orders + CASE 集約 | I/O / CASE |
| Q13 | 中 | 外部結合 + 集約 | NULL 処理 |
| Q14 | 短 | lineitem + part + CASE 比率 | CPU |
| Q15 | 中 | View(WITH)+ 結合 | CTE 展開 |
| Q16 | 中 | NOT IN + 多列集約 | 反結合 |
| Q17 | 中 | 相関サブクエリ | サブクエリ最適化 |
| Q18 | 中 | 3 表結合 + Top-N | ソート / 結合 |
| Q19 | 短 | lineitem + part + 複合 OR | フィルタ最適化 |
| Q20 | 中 | 階層サブクエリ + 半結合 | サブクエリ最適化 |
| Q21 | 長 | 自己結合(lineitem 3 回) | 結合再分散 |
| Q22 | 短 | サブクエリ + 集約 | 集約 |
ベンチマークスクリプト
AWS Labs CloudDataWarehouseBenchmark 配下の Cloud-DWB-Derived-from-TPCH/10GB/queries/query_0.sql には 22 クエリが 1 ファイルに連結されています。これを Python で 22 ファイルに分割し、Q15 だけ revenue ビューが必要だったので WITH 句に書き換えた上で、Bash 製の run_benchmark.sh から batch-execute-statement で順次投入しました。
# run_benchmark.sh の主要部
run_sql() {
local sql_raw="$1"
local label="$2"
local batch_id
batch_id=$(aws redshift-data batch-execute-statement \
--cluster-identifier "${CLUSTER}" \
--database "${DATABASE}" \
--db-user "${DB_USER}" \
--region "${REGION}" \
--statement-name "${TARGET}-${label}" \
--sqls "SET enable_result_cache_for_session = OFF" "${sql_raw}" \
--query 'Id' --output text)
# 完了待ち + 結果 SubStatement[1] の Duration を採用
}
計測方針は以下の通りです。
| 項目 | 設定 |
|---|---|
| 計測回数 | ウォームアップ 1 回 + 本計測 3 回 |
| 評価値 | Data API Duration(ナノ秒)の median |
| Result Cache | SET enable_result_cache_for_session = OFF を必ず先行実行 |
| クラスタ | rg2 / xlplus2 を端末から並列起動 |
各 execute-statement は新しいセッションで実行されるため、batch-execute-statement で SET 文と本体クエリを同セッションに同梱することで Result Cache を確実に切ります。先行ウォームアップで Q01 を 3 回回すと dur=604/615/615 ms と安定しており、Result Cache が効いていないことを実測でも確認できました。
計測結果(median ms)
# rg2 / xlplus2 を別端末から同時起動
./scripts/run_benchmark.sh --target rg2 --cluster-identifier rg2 \
--database dev --db-user awsuser --region us-east-1 --iterations 3
./scripts/run_benchmark.sh --target xlplus2 --cluster-identifier xlplus2 \
--database dev --db-user awsuser --region us-east-1 --iterations 3
ウォームアップ 1 回 + 本計測 3 回(合計 88 実行 × 2 クラスタ = 176 実行)が両クラスタとも全クエリ FINISHED で完了しました。median 値と speedup を以下にまとめます。
| Query | rg2 median (ms) | xlplus2 median (ms) | speedup (xlplus2 / rg2) |
|---|---|---|---|
| Q01 | 605 | 907 | 1.50 |
| Q02 | 238 | 389 | 1.63 |
| Q03 | 225 | 313 | 1.39 |
| Q04 | 192 | 279 | 1.45 |
| Q05 | 277 | 364 | 1.31 |
| Q06 | 64 | 77 | 1.20 |
| Q07 | 256 | 384 | 1.50 |
| Q08 | 268 | 414 | 1.54 |
| Q09 | 524 | 774 | 1.48 |
| Q10 | 354 | 540 | 1.53 |
| Q11 | 139 | 207 | 1.49 |
| Q12 | 134 | 203 | 1.51 |
| Q13 | 806 | 1,334 | 1.66 |
| Q14 | 132 | 173 | 1.31 |
| Q15 | 176 | 271 | 1.54 |
| Q16 | 417 | 632 | 1.52 |
| Q17 | 266 | 386 | 1.45 |
| Q18 | 889 | 1,179 | 1.33 |
| Q19 | 318 | 491 | 1.54 |
| Q20 | 248 | 418 | 1.69 |
| Q21 | 707 | 1,079 | 1.53 |
| Q22 | 289 | 448 | 1.55 |
| 合計 | 7,524 ms | 11,262 ms | 1.50 |
22 クエリの speedup を集計すると以下になりました。
- speedup 中央値: 1.51 倍
- speedup 平均: 1.48 倍
- speedup 最大: 1.69 倍(Q20: 階層サブクエリ + 半結合)
- speedup 最小: 1.20 倍(Q06: 単表 lineitem + 範囲述語、もともと 64ms と短い)
公称値の「最大 2.2 倍」は届きませんでしたが、これはピーク値であり、22 クエリ平均で 1.5 倍前後が出ているのは妥当な水準だと考えられます。Q13・Q20 のような結合や半結合が多いクエリ、Q01・Q21 の重い集計クエリで 1.5〜1.7 倍が出ていて、ワークロードが厳しいほど効きが大きい印象です。
シナリオ③: コスト効率(円 / クエリ・東京リージョン前提)
レイテンシ計測自体は us-east-1 で実施しましたが、実運用を想定して 東京リージョン (ap-northeast-1) のオンデマンド単価で円 / クエリを試算します。単価は検証日 (2026-05-17) の aws pricing get-products で取得した値、為替は 1 USD = ¥150 の概算 TTM を使い、以下の式で算定します。
aws pricing get-products --service-code AmazonRedshift --region us-east-1 \
--filters "Type=TERM_MATCH,Field=instanceType,Value=rg.xlarge" \
"Type=TERM_MATCH,Field=location,Value=Asia Pacific (Tokyo)" \
"Type=TERM_MATCH,Field=productFamily,Value=Compute Instance"
クラスタ稼働コスト(円/秒) = ノード単価(USD/h) × ノード数 × 為替(JPY/USD) ÷ 3600
1 クエリあたりコスト(円) = median レイテンシ(秒) × クラスタ稼働コスト(円/秒)
| クラスタ | ノード単価 (USD/h, 東京) | ノード数 | 稼働コスト (円/秒) |
|---|---|---|---|
rg2 (rg.xlarge) |
0.8946 | 2 | ¥0.07455 |
xlplus2 (ra3.xlplus) |
1.278 | 2 | ¥0.10650 |
ノード単価だけで見ると rg.xlarge は ra3.xlplus 比で約 30% 安く、22 クエリの median 合計と単価を掛け合わせると、次のようになります。
| 指標 | rg2 | xlplus2 | rg2 / xlplus2 |
|---|---|---|---|
| 22 クエリ合計 median | 7.52 秒 | 11.26 秒 | 0.67 |
| クエリセット合計コスト | ¥0.5609 | ¥1.1994 | 0.47 |
| 1 クエリ平均コスト | ¥0.02550 | ¥0.05452 | — |
コスト比 (rg2 / xlplus2) は 0.47、つまり同じ 22 クエリを東京リージョンで実行するのに rg2 のほうが約 53% 安く済む 結果になりました。「vCPU 単価 30% 削減」と「レイテンシ 1.5 倍速」が掛け合わさり、コスト効率では 2 倍近い差が出る形です。
レイテンシは us-east-1 の実測値、コストは東京リージョン単価で試算しています。リージョン間のレイテンシ差は本検証では考慮していません。並列実行下のスループットも計測しておらず、単発レイテンシ × 単価で算出した値であるため、実運用の同時実行性能を反映するものではありません。
考察
検証して感じたポイントを整理します。
- ローカルテーブル対象、22 クエリ平均で 1.5 倍のレイテンシ高速化が安定して出る: 短クエリ(Q06: 64ms / Q14: 132ms)でも 1.2〜1.3 倍、重いクエリ(Q01・Q13・Q18・Q21 など 500ms 以上)で 1.5〜1.7 倍と、レンジを問わず一定の改善が確認できました。公称の「最大 2.2 倍」はピーク値で、ワークロード全体ではこれより低い倍率が現実的だと感じます。
- コスト効率は約 53% 削減(東京リージョン換算): rg.xlarge は ra3.xlplus に対してノード単価が約 30% 安く(東京: $0.8946/h vs $1.278/h)、その上でレイテンシも 1.5 倍速なので、円 / クエリで見ると半分以下になります。同じワークロードを 1 / 2 のコストで動かせる計算で、ノード単価表だけ眺めるよりインパクトが大きい結果でした。
- COPY ロードも約 1.38 倍速い: クエリ性能ほどではないですが、TPC-H 10GB の 8 表合計で 83 秒 vs 114 秒。Graviton と統合 I/O の効果は単発クエリだけでなく書き込み系にも出ています。dev 環境のリストアやサンプルデータ投入が早く済むメリットは小さくないと思います。
- Redshift Data API で正しく Result Cache を切るには
batch-execute-statementが必要:execute-statementでSET ...; SELECT ...を送ると先頭のSETだけ実行されて結果セットが空のまま FINISHED になります。今回はSET enable_result_cache_for_session = OFFと本体クエリをbatch-execute-statementの 2 SQL として同セッションで投げ、SubStatements[1].Durationを採用する形にしました。 - 公平性を担保するには
default.redshift-2.0パラメータグループの揃え方も要確認: 今回は両クラスタともdefault.redshift-2.0を使用しており、AutoMV やanalyze_threshold_percent等もデフォルトのまま揃えています。本気で再現性を求める場合はカスタムパラメータグループを切る方が安全ですが、defaults 同士の比較でもデータ・統計情報・search_path・Result Cache を揃えれば 1.5 倍前後の差は安定して観測できます。 - 同時実行スループットは別途検証が必要: 単発レイテンシしか測っていないため、複数ユーザー / 複数クエリ並列下の挙動(Concurrency Scaling、WLM スロット争奪)は別の検証で追う必要があります。BI ツールからの実 E2E や、大規模 ETL での挙動評価は本検証のスコープ外です。
最後に
rg.xlarge × 2 と ra3.xlplus × 2 を us-east-1 にて TPC-H 10GB で比較した結果、以下が確認できました。
- クエリレイテンシ: 22 クエリ speedup 中央値 1.51 倍(合計 7.52 秒 → 11.26 秒)
- コスト効率(東京リージョン単価で試算): 同一ワークロードでの円 / クエリ比 0.47(rg2 が約 53% 安い)
- COPY ロード性能: 8 表合計 speedup 1.38 倍(83 秒 → 114 秒)
公称値(最大 2.2 倍)はあくまでピーク値ですが、TPC-H 10GB という比較的軽量なワークロードでも 1.5 倍前後・コスト半減という成果が、決定論的・再現性の高い手順で得られました。RA3 を本番運用していて RG への移行を検討している方の判断材料の一助になれば幸いです。
並列スループットや Iceberg 外部テーブルに対する性能差、より大きいデータセット(100GB・1TB)での比較はクレジットがもらえたら別の検証で追っていきます。
合わせて読みたい







