WHERE句の重要性
WHERE句を設定せずに、無闇にSELECT文を投げてはいけない。普通に考えれば当たり前のことです。でも、それを改めて感じたのが昨日。オチから書くと本番環境でのトラブルを起こすには至らなかったのですが、WHERE句の大切さを痛感したので書き残しておきます。
ある調査のために本番DBに検索を掛ける必要があったんです。検索条件がいまいち曖昧だったので、CSVでダウンロードしてあとで考えようと思い、気軽にWHERE句ナシのSELECT文を投入。あとで知ったのですが、検索を掛けたテーブルに格納されているレコード数は2,000万以上。そもそもレコード数が多すぎだろって話はまた別の機会に。さて、SQLを投げてからレスポンスが即座に帰ってくることはなく。。。
…10秒経過、
…30秒経過、
…60秒経過。
あれ、もしかしてヤバくない?
ここで何を思ったか、同じSQL文を再度実行。当たり前のように回答ナシ。このとき朝10時半すぎ。検索を掛けたシステムは今が利用のピーク期です。エアコンが強すぎて寒いくらいのオフィスで嫌な汗たらたら。10分前に戻りたい。
ひとまず、本番のシステムで問題が起こってないかを確認。…システムの動きは問題なし。大惨事になる可能性はなくなりました。次に確認したのがvmstatです。すると、普段は30%にも至らないCPU使用率が90%以上を常にキープしているじゃありませんか。タイムアウトを起こすこともなく、DBはずっと検索処理を頑張っていたようです。
結局、15分くらい嫌な思いをしてからCPU使用率が通常の値に復帰。あの瞬間はすごく嬉しかった!と同時に、WHERE句はどんなときでも絶対に設定しないとダメだなと思うようになりました。あのままDBが落ちたり、OSがハングしてしまっていたら、と想像しただけでゾッとします。
昔、同じ部署の上司に「そこはまずcountしようよ」と注意されたこともちらほら。開発機だったけど。
しかし、CPU90%は泣きたくなるかも。
偶然にも今、全文検索エンジンを使った検索のパフォーマンス改善と戦ってます。
大切だよね、カウント。
今回のは後付けで数えてみたんだけど、
嫌な思いをしたあとだったから、
自分でコマンドを打たずにDBの管理者に依頼したw
全文検索と言われてもNamazuしか思い浮かばない。。。