2012-01-16 5 views
3

私は、ユーザーが異なるユーザーから複数のメッセージを受け取るiPhoneアプリケーションを作成しています。これらのメッセージは、sqlite3データベースに格納されます。ユーザは、受信したメッセージを1人のユーザから削除したい場合があるかもしれないが、古いユーザを削除した後も、そのユーザから新しいメッセージを受信し続けることを確実にする。メッセージを取得するので、sqlite3のパフォーマンスの面では何が良いですか?不必要な行を削除するか、不要に設定しますか?

は、ユーザーが(パフォーマンスの面で)メッセージを削除したいときシナリオが使用することをお勧めしSELECTステートメントを使用して行われます。

  1. DELETE通常、すべての古いメッセージSELECT Messages FROM TableName WHERE UserID = (?) AND IsDeleted = 0
  2. :のようなステートメントを使用して、新しいメッセージを取得タイプ INTEGERの表に、このフィールドに1を設定し DELETE要求に応じて、その後にフィールドを追加します SELECT Messages FROM TableName WHERE UserID = (?)
  3. :とのようなステートメントを使用して新しいものを取得するために継続

もう1つシナリオ1(通常DELETE)を使用すると、ディスク上のデータベースファイルの断片化が発生しますか?

事前に感謝します。

答えて

1

SQLのSELECTDELETEの両方が同じ速度で動作し、シナリオ1がデータベースに迷惑なタプル(不要な行)がないことを許可するため、シナリオ1を使用する方がはるかに優れています。

削除プロセスの後にデータバックアップを実行する場合は、シナリオ2は必須ですが、将来的にパフォーマンスが低下するデータベースのサイズが大きくなることを考慮する必要があります。

最後に、データベースに削除操作を実行しても、断片化の問題は発生しません。ほとんどのデータベースでは、エンジンでフラグメンテーションと最適化ツールが使用されているためです。

1

DELETEがうまく動作しないと、かなり厄介なデータベースになります。逆の証拠がない場合、私はあなたが正常に削除することが安全だと思います。データベースの全体像は、これらの種類の操作を効率的にすることです。

+0

あなたの答えはありがたいですが、これは別の疑問を提起します。私はいくつかのアプリケーションは、ユーザーがそれらを削除した後にメッセージを保持していることに気づいた。あなたはそれが自分の理由を持っていると思いますが、それはパフォーマンスとは関係ありません。 – antf

+0

私が見たことのないアプリについては推測できません。そのことについては、それらのアプリの作者がパフォーマンスや信頼性について全く気にしないかどうかはわかりません。実際に自分が行った選択の理由を実際に知っていない限り、自分の設計を実装に基づいて行うべきではありません。 – StilesCrisis

1

IMHOあなたがDELETEを使用しない場合は、しばらくするとDBが大きくなり、各SELECTの効率が低下します。したがって、再利用されない行を削除する方が効率的です。

関連する問題