2016-06-28 13 views
0

sqlite3では、インデックス付きデータベースがあります。インデックス付きでは、すべてのテーブルの行の各文字列情報が整数で置き換えられています。整数と文字列のマッピングを含むすべてのテーブルの各フィールド。sqlite3 - インデックス付きデータベースにデータベースを追加し、新しい行をインデックスする

ここで、インデックス付きデータベースに、まだ処理されていない別のデータベースを追加したいと思います。つまり、行内に実際の文字列が残っています。テーブルはまったく同じ構造をしているので、新しいデータベースの各テーブルに対して、古いデータベースのそれぞれのテーブルにすべての行を追加します。しかし、文字列を置換する整数w.r.t.古いデータベースの文字列と整数のマッピング(古いデータベースでは見られなかった新しいデータベースの文字列のマッピングを更新)

これを行う方法がありますか?

アプリケーションは分散索引作成プロシージャで、ここではほぼ実行します。 10個のジョブがより小さいデータベースでFIFOキューを埋めるために1つのジョブを実行し、キューからデータベースを選択し、インデックスを作成して最後の大きなデータベースに追加します。

答えて

0

私はPythonからデータベースにアクセスしました。

私がやったのは、すべてのコンテンツを持つ整数行が新しいデータベースに追加されるまで、メモリ内のインデックス構造をpythonオブジェクトとして維持することでした。これにより、私はexecutemany()関数によって一括挿入を行うことができます。すべての行がデータベースに追加されると、pythonインデックスオブジェクトがデータベースに一括して挿入されます。

これは、データベースをインデックス構造としてオンザフライで使用するのとは異なり、非常に高速です。 (しかし、整数はその大ではありません)インデックスオブジェクトがする必要がある

  • (パイソン)

    1. 格納された値は、インデックステーブルのエントリの外部キーにすることはできません。しかし、それは、少なくとも以下の2つの欠点があります私はメモリベースのアプローチは、不必要なレンダリング可能性があり、私はSSDを使用しようとしなかったことを言っている

    (別の言語で、それはおそらく、それはPythonでよりもはるかに少ないメモリを必要とする)メモリに収まります。

  • 1

    インデックス付きのテーブルは次のようになります。

    CREATE TABLE data (ColX INTEGER, ColY INTEGER); 
    -- foreign key constraints omitted 
    

    のは、インデックステーブルは、文字列の列にUNIQUE制約を持っていると仮定しましょう:

    CREATE TABLE ColX_strings (ID INTEGER PRIMARY KEY, Text TEXT UNIQUE); 
    CREATE TABLE ColY_strings (ID INTEGER PRIMARY KEY, Text TEXT UNIQUE); 
    

    その後、我々は、単にINSERTを使用するかを無視することができます新しいもの、つまり古いものと競合しない新しい文字列を追加します。

    INSERT OR IGNORE INTO ColX_strings(Text) SELECT ColX FROM newDB.data; 
    INSERT OR IGNORE INTO ColY_strings(Text) SELECT ColY FROM newDB.data; 
    

    すべての文字列がわかっているので、コピーするときにそれらを探すことができます:

    INSERT INTO oldDB.data(ColX, ColY) 
    SELECT (SELECT ID FROM ColX_strings WHERE Text = T.ColX), 
         (SELECT ID FROM ColY_strings WHERE Text = T.ColY) 
    FROM newDB.data AS T; 
    
    +0

    ありがとうございました。私も同じ考えがあると思います。しかし、あなたのコードは明確です - 私はそれを試し、速度の向上をチェックします。 –

    +0

    これは必要な数の2倍の選択をしませんか?最初にインデックス構造を作成し、後で整数を参照するとき。 –

    +0

    1つのSELECTを使用してコードを記述し、どれぐらい高速になるかを測定することはできません。 (そしてそれが努力する価値があるかどうかを問う)。 –

    関連する問題