2017-07-03 9 views
0

特定の表にVARCHAR値のみを含むデータベースを操作する場合、そのような表を更新するときのパフォーマンスをどのように改善できますか?SQLiteでVARCHAR値のみを使用してデータを操作するときのパフォーマンスを向上させるにはどうすればよいですか?

このようなテーブルを更新する際の問題は、新しいデータが取得されたときに、INSERTまたはUPDATEの行になるかどうかを決定する必要があります。

テーブルが小さい場合は、新しい値が既に存在するかどうかを調べるためにSQLクエリを実行し、結果に応じてINSERTまたはUPDATEにするのは簡単です。しかし、あなたが100以上の新しいデータ行を取得している場合、それらのうちのいくつかはすでにデータベース上にあるかもしれないし、そうでないかもしれませんし、全く新しいかもしれないものもあります。コンプリート。

特定の値を共有するデータベース上のすべての内容を削除することができますか?同じ日付を使用すると、新しいデータは各行を個別に照会するよりも潜在的に優れていますか?

例:例2

 1 2 3 ... 20 
01/01 A4 A5 A6 ... A23 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1 Z5 Z6 ... Z20 

 1 2 3 ... 20 
01/01 A1 A2 A3 ... A20 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1 Z2 Z3 ... Z20 

更新した後

 1 2 3 ... 20 
01/01 A1   ... A20 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1  Z3 ... Z20 

例2更新後:

 1 2 3 ... 20 
01/01 A4 A5 A6 ... A23 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1 Z5 Z6 ... Z20 
+1

'INSERT OR REPLACE'を使用してください。 – CommonsWare

+1

さらにトランザクションベースの操作を使用して、挿入/置換するアイテムごとに開閉しないようにします – tyczj

+0

別のアプローチでは、タイムスタンプの列を追加し、最後の行を各行に戻して更新する必要がなくなりますコマンドを実行し、最終的に各レコードの最後のタイムスタンプ以外のすべてを削除するプロセスを実行します。 –

答えて

0

書き込みは読み取りよりも悪いです(データベースがテーブルを変更する前に一部のページを読み込む必要があるため)、実際には必要ないDELETEまたはREPLACEを行わないようにしてください。

(REPLACE文は、常にそれがDELETEと同じくらい悪いですので、新しいものを挿入する前に(存在する場合)古い行を削除します。)文または独自のクエリー検索をREPLACEかどうかは関係ありません

古い行の場合は、INSERTを避けることができない場合は、INSERTを避けることもできます。

テーブルが正しくindexedである場合、つまり値が検索に使用される列にインデックスがある場合、ルックアップは非常に高速です。

+0

これは私の最初のアイデアでしたが、トランザクションですべてを実行するために構築したコンパイル済みのステートメントでうまくいくかどうかはわかりません。個々の 'INSERT'を使うよりもはるかに高速ですが、' UPDATE'と 'INSERT'のどちらかを選択する必要があります。 – user1676874

+0

あなたの質問には、コンパイルされたステートメントやトランザクションは言及されていません。 –

+0

私はそれが他の答えに対するコメントで示唆されたことを認識しています。私は混乱のために申し訳ありません。 – user1676874

関連する問題