2016-07-05 21 views
0

私はtable2のvakyesを使用してtable1から値を減らす必要がある2つのテーブル、table1(非常に大きな)とtable2(はるかに小さい)でこの巨大な(8 GB/14126762行)Sqlite3遅い更新

私は小さなデータベース(5MBのデータベース)を使っていくつかのテストを行っていましたが、それは問題ありませんでした。しかし、今、私は大きなデータベースでそれを使用すると、それは永遠にかかり、全く動作するかどうかわかりません。

たとえば、INSERTコマンドでデータベースを作成するには12分かかります。

面倒な取引は以下の通りです:

UPDATE table1 
    SET vl_empenho = vl_empenho - 
    (SELECT vl_estorno 
    FROM table2 WHERE table1.cd_ugestora = 
    table2.cd_ugestora AND table1.dt_ano = 
    table2.dt_ano AND table1.nu_empenho = 
    table2.nu_empenho) 
    WHERE cd_ugestora IN (SELECT table2.cd_ugestora FROM 
    table2 WHERE table1.dt_ano = 
    table2.dt_ano AND table1.nu_empenho = 
    table2.nu_empenho); 

sqliteは、トランザクションに堪能ではない - 私は私が望んで与えたが、それは冗長な場合、私は知りません。

ありがとうございました!

+1

あなたの関係はインデックスに登録されていますか?そうでない場合は、更新する前にインデックスを作成するのがよいでしょう。 –

+0

次のインデックスのみをインデックス化しますか? CREATE INDEX MyLittleIndex ON table1(vl_empenho); CREATE INDEX MyLittleIndex2 ON table2(vl_estorno); – nicmano

+1

ローカルまたはネットワークドライブにsqliteファイルを保存していますか? –

答えて

0

コメントや他のstackoverflowの関連する質問を読んだ後、私はまた私が設定し、クエリの各列のインデックスを作った。それと

PRAGMA synchronize = OFF; 
PRAGMA jorunal_mode = MEMORY; 

を、私は言及した上でUPDATEを実行するために20分かかりましたし、ファイルサイズ(実際には10GB)を考慮して、適切であると思われるINSERTコマンドでは6分です。

ありがとうございました!