【正解】A
【0からの解説】
Athena はサーバーレスのクエリサービスで、S3 からスキャンしたデータ量に応じて課金・処理されます。クエリを速くする鍵は「スキャンするデータ量を減らす」ことと「並列に読み取る」ことの 2 点です。
本問は「属性のサブセット(一部の列)だけをスキャンする」ワークロードなので、行指向の CSV/JSON/Avro よりも、列だけを読み出せる
列指向フォーマット(ORC や Parquet) が圧倒的に有利です(必要な列だけを読む列プルーニング)。さらに「日付ごとにパーティション分割」すれば対象日のデータだけをスキャンでき(パーティションプルーニング)、列指向プッシュダウンで不要なデータブロックの読み取りもスキップできます。
A と D はどちらも列指向+日付パーティション+プッシュダウンで似ていますが、決め手は「並列性」です。Athena は 1 つのクエリを多数のリーダーで分散処理するため、データが複数ファイルに分かれているほど並列度が上がり高速になります。A は「複数の ORC ファイル」にして並列性を高めると明記しているのに対し、D は「1 日 1 ファイルの単一 Parquet」にまとめてしまうため、その日のクエリを 1 ファイルしか並列に分割できず、並列度が下がってかえって遅くなる可能性があります。最短のクエリ時間という要件には A が最適です。
【誤りの選択肢】
B:JSON は行指向のテキスト形式で、一部の列だけを効率的に読めず、CSV と同様にスキャン量が大きくなります。「動的フィルタリング」はこの列サブセット高速化の本質ではありません。
C:Avro は行指向のバイナリ形式で、列サブセットのクエリ最適化には Parquet/ORC のような列指向形式が適します。「射影ベースのパーティショニング(partition projection)」はパーティション管理の手法であり、行指向のままでは列スキャン削減効果が得られません。
D:列指向 Parquet+パーティション+述語プッシュダウン自体は有効ですが、「1 日 1 つの単一ファイル」にまとめると Athena が並列に読み取れず並列度が下がります。最短クエリ時間を狙う本問では、複数ファイルで並列性を確保する A に劣ります。
【参考】
Amazon Athena のパフォーマンスチューニング Top 10 のヒントAthena でのパフォーマンス調整