【Redshift】timestamp型のカラムを条件にして検索する時の書き方を変えたら爆速になった話

2017.12.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Redshiftでtimestamp型のカラムを条件に検索することがあると思います。先日、方法によって処理時間に差が出るのか試してみたのですが自分的には驚きの結果でした。4つのパターンを3回ずつ試して時間を計ってみました。前提条件は以下になります。

  • テストしたテーブルの件数は約3億件で列数は50です。
  • Redshiftは ds2.xlarge 1台で試しました。
  • 検索に使うカラムは分散キーやソートキーではありません。
  • countの結果は362269件でした。

to_timestamp関数を使った場合

まずは条件の方を to_timestamp関数で変換してやってみました。

select count(*) from テーブル名
where カラム名 = to_timestamp('2017/04/12 05:00:00', 'YYYY/MM/DD HH24:MI:SS');
1回目 37.64s
2回目 37.8s
3回目 37.65s

to_char関数を使った場合

次にカラムの方を to_char関数で変換してやってみました。

select count(*) from テーブル名
where to_char(カラム名, 'YYYY/MM/DD HH24:MI:SS') = '2017/04/12 05:00:00';

全レコード変換するのでto_timestamp関数を使うパターンより、こちらパターンは遅いのではないかと思っていたのですが意外とそうでもなかったです。

1回目 33.22s
2回目 33.61s
3回目 33.01s

キャストした場合

最後に文字列を 'YYYYMMDD HH24MISS' の形式にして、Timestamp型にキャストする方法です。

select count(*) from テーブル名 where カラム名= '20170412 050000'::TIMESTAMP;

いきなり早くなりました。何かの間違いではないかと疑うレベルで早かったです。ですが結果は他のSQLと一致していました。

1回目 0.14s
2回目 0.12s
3回目 0.13s

文字列で指定した場合

最後に'YYYY-MM-DD HH24:MI:SS'形式の文字列にしてみました。

select count(*) from テーブル名 where カラム名= '2017-04-12 05:00:00';

結果としてはキャストした場合とほぼ同じ時間でした。'YYYY-MM-DD HH24:MI:SS'形式の他に 'YYYY/MM/DD HH24:MI:SS'形式 や 'YYYYMMDD HH24MISS'形式 にした場合でも結果は同じでした。いちいち関数で型変換とかしなくていいということですね。

1回目 0.14s
2回目 0.13s
3回目 0.14s