SELECT、INSERT、UPDATE、DELETE、みんな個性があるけれど、知らなかったDELETE文の遅さということで、そんな話です。
⇧ データの削除はなかなかに根深い問題そうですね。
⇧ 大量データを扱うためにバッチ高速フレームワークなるものも開発されているようです。
Microsoft SQL Server には、という一般的なコマンド ライン ユーティリティが含まれています。 bcpの高速で一括 SQL Server データベースのテーブルまたはビューに大きなファイルをコピーします。 SqlBulkCopy クラスを使用すると、同様の機能を備えたマネージ コード ソリューションを作成できます。 SQL Server のテーブルにデータを読み込むには、INSERT ステートメントを使用するなどの方法もありますが、SqlBulkCopy を使用すれば他の方法よりもパフォーマンス面で大幅に有利になります。
⇧ データのINSERTについても、高速化の方法があるようです。
ことの始まりはWordPressの管理画面にログインできない
Microsoft Azure上にアップしていたWordPressの管理画面にログインしようとすると、何回やってもログイン画面にリダイレクトしてしまうという現象が起きました。
原因は、データベースの許容量以上にデータが入っていたために起こっていたようです。
ということで、データを削除するために、MySQL Workbenchを使ってデータベースに接続し、テーブルのレコード(データ)をDELETE文で削除してみました。
DELETE文を実行したけれど
DELETE文を実行してpostテーブルのレコード(900件ぐらい登録)を400件ぐらい削除して、SELECT文でpostテーブルを表示すると、400件分のレコードは無くなっていました。
改めて、WordPress管理画面のログインを試みるも、ログイン画面にリダイレクト!
慌てすぎは良くない、ということで10分後、再度試すも弾き返されるさまよえる蒼い弾丸、そのあと10回ぐらい連続でログインを試みるもすべてリダイレクト!なんでや!データ消したやんけ~、かくしてその日はログインを断念。
翌朝、ログイン成功
翌朝、真っ先にログインを試みるとあっさり成功!な、なんで~?
時がすべてを解決する、ってことですか?みたいな感じでモヤモヤさまぁ~ず的モヤモヤ感を抱えていて日々を過ごします。
翌日、職場の方にお聞きしたところ、な、なんと目から鱗な話を教えていただけました!
DELETE文は時間がかかる
データベースの性能にもよりますが、データをDELETE文で処理する場合、DELETE文を実行すると、データをすぐに消すのではなく、まずはログファイルにデータの内容などを記録していくため実際にデータが削除されるまでには時間がかかるとのこと。
よく、レンタルサーバーなどで「『sv1~sv4.php、sv1~sv4.wpサーバー』12/26 AM5:00頃~AM8:00頃にかけて5分~15分程度のサーバー停止を伴うシステムメンテナンスについて」 サーバーを一時的に止めるのは、データベース内で不要になったデータなどをDELETEするのには時間がかかるからという理由もありそうです。
ログあれこれ
データベースによってログが異なるようです。
mysqlのログはバイナリログと言いまして、mysql-bin.xxxというファイルに出力されます。この部分は、ibm db2ですと、アーカイヴログ、oracle ですと、redo ログという部分です。ちなみに、デフォルトの設定ですと、mysqlはバイナリログを出力しません。
DELETE文はコストが高い
400件のデータでも、DELETE文で相当に時間がかかることが分かり、大規模なシステムなどで10万件ぐらいのデータを消したりするときってどのぐらい時間がかかるんだろうと、ゾッとした次第です。
⇩ ハイウォーターマークについては下記サイトへ
・Oracleで大量データのinsertとdeleteを繰り返すと遅くなる理由 - 大人になったら肺呼吸
今回はこのへんで。