0

Androidアプリを作ったのですが、古い記録を定期的に削除してくれる機能があります

delete from tablea where col1 = 'value1' and col2 = 'value2' and postdate < '2010-06-14'

tablea の行の合計数が 50,000 を超えると、パフォーマンスの問題が発生します。500 件のレコードを削除するには、約 45 秒かかります。

この where 句のインデックスは既にあります。

CREATE INDEX indexa on tablea (col1, col2, postdate)

PRAGMA synchronous=OFF と PRAGMA count_changes=OFF を追加しても役に立ちませんでした。

お知らせ下さい

4

2 に答える 2

1

postdate フィールドのタイプを確認してください。SELECT typeof(postdate). SQLite はTEXTwhere 句に基づいて処理するようです。SQLite には「日付」型の概念がなく、「日付」NUMERICに対してアフィニティが発生するだけです。s を挿入していない場合はNUMERIC、おそらく文字列比較を行っているため、予想される整数比較よりも遅くなります。sを挿入している場合NUMERIC、where 句によって最初にそれらがキャストされTEXT、次に where 句の条件が適用される可能性があります。

データ型に関するドキュメントを確認できます。

于 2010-07-14T04:59:31.733 に答える
0

あなたのインデックスは書かれているほど役に立たないように見えます。私はあなたが望むと思います:

CREATE INDEX indexa on tablea (col1, col2)
CREATE INDEX indexb on tablea (postdate)

読んだように、ドキュメントの私の解釈は、あなたの例でどの行が参照されているかを把握するために、データベースは特定の値のペアと一致する特定の日付を持っている必要があることを示しています(インデックス/インデックスを検索できるように) . 特定の日付はありません。代わりに、日付の値の範囲を探しています。

問題は、日付値の比較可能性が作成した組み合わせインデックスに含まれているため、その情報を簡単に取得できず、インデックスの使用が制限されることです。

もちろんお腹いっぱいになれます。私の主な経験は sqlite ではありません。それでも、上記を試してみてもそれほど害はありません。

于 2010-07-14T02:40:02.627 に答える