萩萩日記

世界に5人くらい存在するかもしれない僕のファンとドッペルゲンガーに送る日記

OracleからPostgreSQLへ

60万件ほどのデータがあるDBをOracleからPostgreSQLへ移行しようと思い、データコンバートしてSELECTかけてみたら異様に重い。こりゃ参ったと思いながら、「いやー、PostgreSQLで大丈夫ですよー」とか言ってた打ち合わせが脳裏をよぎり焦るものの、EXPLAINを見てみたら、DATETIME型のカラムにインデックスを張ってあるのにもかかわらず、何の因果かシーケンススキャン。

あらまあ。

いや、あらまあとか言ってる場合ではなくて。

MySQLで試したときは十分なスピードが出ていたのだけど今回は諸般の事情でPostgreSQLにせざるを得ず、とはいえスピードが全然出ないんじゃあしょうがないからPostgreSQLMySQLをどっちも入れちゃおうかしら、ああでもそんな七面倒臭いことやりたくないざますと、いろいろ悩んでいたところ、ふと、DATETIME型と比較しているのはTIMESTAMP型だということに気がついた。そこで、::DATETIMEと、DATETIME型にキャストしてみたところ、ちゃんとインデックスを使うようになった。DATETIME型のカラムとCURRENT_TIMESTAMPを比較していたところは、アプリ側で現在時刻を設定するように変更。しかし、なぜTIMESTAMP型と比較したからってシーケンススキャンになるかね。

ちなみにバージョンは7.2.8。早く8を使えという話かもしれん。