2009-08-06 7 views
3

バックアップジョブに関する情報を格納するためにsqliteデータベースが使用されています。実行ごとに、特定のテーブルに約32,000のエントリを追加した結果、およそ25MBが増加します。SQLiteでのパフォーマンスの主な効果

このテーブルは、特定の情報を別のテーブルのレコードにリンクするために使用される「マップテーブル」です。これには、使用しない主キー(autoincrement int)があります。

sqliteは、値に応じてINTカラムに1,2,4または8バイトを予約します。このテーブルにはINTタイプの3つの追加列しかありません。

私は、クエリとしてフィルタとして使用する列(WHERE)のインデックスをデータベースに追加しました。

索引などが存在し、説明されている状況では、主キーはパフォーマンスの面でメリットがありますか?

注:パフォーマンスはこのプロジェクトにとって非常に重要ですが、32,000エントリのジョブに10msを保存すると、さらに10MBのデータが必要になります。

答えて

2

主キーインデックスは、特定の主キーの行を検索するために使用されます。主キー値が一意であることを保証するためにも使用されます。

他の列を使用してデータを検索すると、主キー索引は使用されないため、パフォーマンス上の利点はありません。しかし、単なる存在であってもパフォーマンスに悪影響を及ぼすべきではありません。

不要なインデックスは、ディスク領域を浪費し、INSERT文とUPDATE文の実行速度を低下させます。クエリのパフォーマンスに悪影響を及ぼすことはありません。

+0

私はこれにほとんど同意します。重要なアイデアは、データベースをメモリに保持することです。インデックスが大きすぎる場合は、重要です。 – Unknown

+0

@未知数:通常のディスクバックアップのメモリキャッシングデータベースの場合、未使用のインデックスはメモリに入ってはならず、そうであれば、すぐにもう一度追い出されます。しかし、バックアップディスクストレージを持たない完全なインメモリデータベースを構築している場合、これらのインデックスはおそらくあなたを傷つけるでしょう。 – Thilo

0

本当にこのIDを使用しない場合は、この列+主キーを削除しないでください。使用されていない主キーID列を有効にする唯一の理由は、別の表とのマスター/詳細関係を作成できるようにすることです。

もう1つの可能性は、列を保持するが、主キーを削除することです。つまり、アプリケーションはすべてのinsertステートメントで一意のIDを提供する必要があります。各バッチ処理の前後で、この列がまだ一意であるかどうかを確認する必要があります。これは、複数の並行性の問題のためにMySQLやOracleでは動作しませんが、sqliteで動作します。

関連する問題