2017-04-23 9 views
0

現在、健康的な時間内にSQLiteデータベースレコードを大規模に更新するのに問題があります。SQLiteレコードの更新速度が改善されました

私は約70,000レコードの小さなデータベースを持っています。私は、レコードをフィルタリングし、コミットするために一括編集するためにNavicatを使用している個人のオフィスをいくつか持っています。 1つのフィールドの大量のレコードをUPDATEしようとすると、すべてがクロールになります。生のSQLクエリを見ると、プログラムがUPDATE ..SET ..を使って操作を実行していることがわかります。

私の質問は、このクエリをより速く実行できるようにすることです。私は更新するためにレコードを照合するために使用される列にSQLiteの自動インデックスを持っていますが、私はすべてを読んで検索しています。 2万レコードの1つのフィールドを更新することは、文字通りNavicatを使用するかどうかにかかわらず、3時間に近づいています。データベース全体は30MBしかないので、私は間違ったことをする必要があります。

他のすべてのデータベース操作はすばらしいスピードで実行され、何が間違っているのかわからず、SQLiteの獣医からのガイダンスを探しています。

+0

上の破損データの余分なリスクの非ゼロの量が付属していますUPDATEはサブクエリを使用しますか? –

+0

生の出力から見ることのできる例を次に示します。UPDATE table SET column = 1.0 WHERE(column_value = 'value') column_valueはSQLiteの自動インデックス付きカラムです。 –

答えて

0

SQLiteがあなたの記述どおりに機能しない理由はほとんどありませんが、私はほとんど同じことを経験しました。

最初に、インデックス付きの列に対してテーブル全体の更新を実行している場合は、インデックス全体をスラッシュしながらインデックスを無駄にすることはありません。更新する前に索引を削除してから、索引を再作成してください。

また、あなたは同期PRAGMAを変更することにより、いくつかの深刻なPERFブーストを得ることができますが、それはクラッシュ(私の経験では極めてまれ)

PRAGMA schema.synchronous = 0 
+0

それが役立つかどうかを見てください。インデックスに関しては、インデックスを作成した列は更新しません。私は別のフィールドを更新していますが、更新する必要があるレコードを照合するために使用されている列にsqlite_auto_indexがあります。スキーマの設定が遅いものをすべて更新するのに十分ではないでしょうか? –

関連する問題