こんにちは。
データがとれません!!
データ移行作業をしていた時です。特定のデータをDB(データベース)から取得しようとしたのですが、データ量が多すぎて1時間以上放置してもデータが取れないのです。単純にテーブルまるまる移行するのであればそこまで悩まないのですが、移行対象となるデータは元々複雑なSQLを実行した結果で、それ通りにデータを取得しないと正しいデータができないので困ったものです。一番大きいテーブルで約1000万のデータがあり、そのテーブルを軸に100万、10万といったデータ量を持つテーブルを結合して情報を絞り込んでいました。移行対象のデータは1日単位でデータを持っていて、通常は1日単位でデータを取得するので複雑な検索SQLでも問題なく検索結果が得られていましたが、移行データは年間単位で取らなければならなかったので問題が発生しました。
これは時間が掛かるがSQLを実行して放置するしか…
誰もが思いつくこの方法は良くないです。なぜならいつ終わるかわからないものを待つには失敗時のリスクが大きすぎます。10時間掛かって取得失敗しただなんて考えただけで魂が抜けそうになります。
ではどうするか!
単純にテーブル一つ一つのレコード数を減らせばよいのです。
使ってるデータ削除できるか!!と思った方。違います。同じ項目を持つテーブルを複製して、複製したテーブルに必要な情報だけを移していきましょう。複雑な検索SQLでも必ず条件が含まれています。その条件を見ながら必要レコードを抽出しただけの複製テーブルを元テーブルと変えて結合するとあら不思議。今まで取得できなかったデータが取得できるようになるではありませんか。
はい。これは私が昔実際に体験した話です。元のデータをいじれないのであれば、別で作ればよいのです。この方法を取りどんなに待っても終わる気配がなかった検索SQLが3秒で対象データを取得する事ができるようになりました。ちなみに移行対象となるデータは約10万件でした。元の約1000万件からデータを絞り込み10万件取得する程度であれば通常すぐ取得できそうなきがしますが、こんなこともあるんだなと良い経験になりました。
本日はこの辺で