Amazon Redshift 
ANALYZEの必要性 
& 
VACUUMの落とし穴
• 深尾 もとのぶ(フリーランス) 
• AWS歴:9ヶ月(2014年3月~) 
• 得意分野:シェルスクリプト 
• 好きなAWS:Redshift
ビッグデータをSQLで 
簡単かつ高速に処理できるDB
S3 
Redshift 
S3 psqlコマンドサマリー 
広告配信の集計システム 
MySQL 
AP 
Relay 
バッチサーバ
Web広告の集計 
• 表示回数, クリック, 予算 
• データ量:5,000件/秒以上 
• 集計間隔:1分 
• 集計所要時間:10秒
事例1 
A N A LY Z E を実行していない
ANALYZEとは? 
ANALYZE 
クエリプランナーで使用するテーブル統計を更新します。 
分布状況やサイズによって 
SQLのクエリプランを最適化
A N A LY Z E を実行しないと 
何が起きたの?
集計処理を軽くしたはずが 
逆に極端に重くなった
総データ量 
集計所要時間 
利用データ量
TIMESTAMP 
(SORTKEY) UID 
10/31 23:55 abc 
10/31 23:56 def 
10/31 23:57 ghi 
10/31 23:58 jkl 
10/31 23:59 mno 
11/1 0:00 pqr 
11/1 0:01 stu 
11/1 0:02 vwx 
11/1 0:03 yz 
SELECT UID 
FROM <TABLE> 
WHERE 
 <SORTKEY> >= ’11/1 0:00’ 
10/31以前のデータを 
スキップしてI/Oを削減
軽くなるはずが・・・ 
クエリの実行時間が30 倍 
40秒1200秒 
クエリ実行中の 
 ストレージ使用率2倍 
メモリの大量消費?
原因 
ANALYZEを実行しておらず 
テーブル統計が実際と乖離 
テーブル統計が更新されるのは 
ANALYZE
psql (8.4.20, server 8.0.2) 
WARNING: psql version 8.4, server version 8.0. 
Some psql features might not work. 
SSL connection (cipher: ECDHE-RSA-AES256-SHA, bits: 
256) 
Type "help" for help. 
dmt01=> 
dmt01=> 
dmt01=> 
ANALYZE; 
テーブル統計を更新
クエリの所要時間 
40 秒 
秒 
1200 
10 
秒 
初期状態 
対象絞り込み 
ANALYZE後
教訓 
定期的にA N A LY Z E で 
テーブル統計を更新する
事例2 
D E L E T E 後のV A C U U M
VACUUMとは? 
VACUUM 
行のスペースの再利用や行の再ソートを行います。 
•データ削除後の解放 
•SORTKEYによるソート 
(差分ソートと全ソート)
ソートは2種類 
•通常は差分ソート 
• DELETE後は全ソート
通常は差分ソート 
古い新しい 
ソート済み 
VACUUM実行 
ソート済み 
未ソート 
未ソート 
VACUUM実行 
ソート済み 
追加 
追加
DELETE後は全ソート 
古い新しい 
ソート済み 
DELETE実行 
ソート対象 
VACUUM実行 
削除 
未解放 
解放+全ソート 
解放済ソート済み
その結果、 
DELETE後に残ったのデータの 
7 ソートに 
時間
DELETE後の全ソートを 
避けることはできない 
DELETE ONLYやSORT ONLYを使えば 
解放とソートを区別することはできるが 
差分ソートと全ソートを 
区別して実行することはできない。
どうやって古いデータを 
削除するの?
時系列テーブルの 
DROPまたはTRUNCATE
時系列テーブルとは? 
時系列テーブルの使用 
データの保存期間が固定されている場合、時系列テーブルの順序でデータを整理することを 
お勧めします。各テーブルは同じであっても、異なる時間範囲のデータが含まれるようにします。 
該当するテーブルで DROP TABLE を実行することで古いデータを簡単に削除できます。大規模な 
DELETE を実行するよりもはるかに高速であり、その後、VACUUM を実行して領域を再利用する 
必要がありません。UNION ALL ビューを作成し、データが異なるテーブルに保存されているとい 
う事実を隠すことができます。古いデータを削除するとき、UNION ALL ビューを微調整し、ドロ 
ップしたテーブルを削除します。同様に、新しい期間を新しいテーブルにロードするとき、新しい 
テーブルをこのビューに追加します。
時系列テーブルとは? 
UNION ALL ビュー 
1月2月3月4月 
5月6月7月 
9月10月11月 
8月 
12月
教訓 
定期的に古いデータを 
削除するなら時系列テーブル
Let’s try Redshift 
Thank you for your attention.

AWS Redshift Analyzeの必要性とvacuumの落とし穴