1

私たちのニーズの 1 つは、一時的なメモリ内データベースを作成してから、さまざまな挿入/選択/更新を実行することです。

一見すると、SQLite は私たちのすべてのニーズを満たしています。インメモリ SQLite DB への接続は、次のように簡単に確立できます。

class SQLiteBase < ActiveRecord::Base
  self.abstract_class = true

  establish_connection(adapter:  'sqlite3', database: ':memory:')
end

少し前に、SQLite テーブルへのデータの一括読み込み (具体的には一括 INSERT) を実行する必要があることが判明したときに、いくつかのパフォーマンスの問題を調査し始めました (これらのベンチマークを参照してください)。

残念ながら、SQLite は一括 INSERT をサポートしていないようです。

バルク INSERT をサポートする SQL ベースの軽量インメモリ データベースは他にありますか?

そのようなものがない場合 – PostreSQL (MySQL またはその他の主要なプレーヤー) などの重いデータベースをインメモリ データベースとして利用する方法はありますか?

postresql/mysql が最適でない場合 – その上にクエリ言語を備えた、C を多用して最適化されたデータ構造が他にありますか? (ルビバインディングあり/なし)。

4

3 に答える 3

2

まず第一に、SQLite は次のメソッドを使用した一括挿入をサポートしています。

  • 多値INSERTの貧弱な代替品:

    INSERT INTO mytable (a,b,c) SELECT 1 a, 2 b, 'x' c 
                      UNION ALL SELECT 2,   5,   'y' 
                      UNION ALL SELECT 3,   7,   'z'
                  ...
    
  • SQLite 3.7.11以降でサポートされている真の多値 INSERT :

    INSERT INTO mytable (a,b,c) VALUES (1,2,'x'),
                                       (2,5,'y'),
                                       (3,7,'z');
    
  • トランザクションの使用:

    BEGIN;
    INSERT INTO mytable (a,b,c) VALUES (1,2,'x');
    INSERT INTO mytable (a,b,c) VALUES (2,5,'y');
    INSERT INTO mytable (a,b,c) VALUES (3,7,'z');
    COMMIT;
    

これらを Ruby または Ruby on Rails に変換する方法を尋ねられた場合、私にはわからないことは認めますが、可能であると思います。

しかし、SQLite がこれらのメソッドをサポートしていなかったとしても、メモリ内データベースの場合、これは実際には問題になりません。実際にすべてメモリ内にある場合、挿入速度は、行を 1 つずつ挿入するか、1 つのトランザクションとして挿入するかに実際には依存しないはずだからです。 . 速度制限は、実際には生のメモリ コピーの帯域幅です。

于 2013-01-25T03:19:35.790 に答える
0

SQLiteは3.7.11の時点でバルクINSERTをサポートしていることが判明しました。

于 2013-01-25T09:57:25.777 に答える
0

HSql は一括挿入をサポートしているようです: http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_insert_statement

于 2013-01-24T18:50:36.600 に答える