KDOC 722: 同じテーブルを条件違いで UNION ALL すると枝の数だけスキャンする

この文書のステータス

  • 作成
    • 2026-11-02 貴島
  • レビュー
    • 2026-11-02 貴島

概要

AWS Athena のクエリで、同じテーブルから一部のパラメータだけが異なる SELECT を UNION ALL で結合していた。

SELECT ... WHERE user.id = 'A'
  UNION ALL SELECT ... WHERE user.id = 'B'
  UNION ALL SELECT ... WHERE user.id = 'C'

これは問題なく動いていたが、ある日クエリ実行がタイムアウトした。UNION ALL の SELECT はそれぞれ別に実行されるので、同じテーブルを SELECT ごとに読み直していた。3つの SELECT なら3回スキャンすることになる。効率がよくない。

条件を IN にまとめると、テーブルを1回読むだけで済む。

SELECT ... WHERE user.id IN ('A', 'B', 'C')

関連

抽象。

  • 同じ意味でも書き方でスキャン量が変わる

関連。