2

パラメータ配列のBLOBフィールド・データを渡す配列DMLINSERTまたは文を実行できますか? UPDATEそして、私の質問のより重要な部分は、可能であれば、BLOB データを含む配列 DML コマンドは、コマンドを 1 つずつ実行するよりも効率的ですか?

TADParamインデックス付きプロパティがあることに気付いたので、可能かもしれないと思いますが、パフォーマンスについての言及もこれを示す例もなく、インデックス付きプロパティのタイプが私のニーズにあまり適していないAsBlobsため、まだ試していませんRawByteString.

私は FireDAC を使用しており、SQLite データベースを使用しています (したがって、複数のParams.BindMode = pbByNumberネイティブ SQLite を使用しています)。私の目標は、非常に小さな BLOB データ (レコードあたり約 1kB) を含む約 100,000 レコードをできるだけ速く (FireDAC の抽象化を犠牲にして) 格納することです。INSERTVALUES

4

1 に答える 1

5

あなたの場合の主なポイントは、SQLIte3データベースを使用していることです。

ではSQLite3、配列 DML は FireDAC によって「エミュレート」されます。これはクライアント サーバー インスタンスではなくローカル インスタンスであるため、(Oracle や MS SQL のように) ネットワーク レイテンシを回避するために、一連の行を準備して一度に送信する必要はありません。

配列 DML を使用すると、SQLite3 で挿入プロセスが少し高速化される可能性がありますが、非常に高速になるとは思えません数値ごとにバインドされたプレーンな INSERT は問題なく機能します。

あなたの場合のパフォーマンスに関する主なヒントは次のとおりです。

  • 単一のトランザクション内にプロセスを入れ子にします (または、1000 行のデータごとに 1 つのトランザクションを使用することをお勧めします)。
  • INSERT ステートメントを準備し、バインドされたパラメーターを使用して毎回再実行します。
  • デフォルトでは、FireDAC は SQLite3 を最速のオプション (ロックの無効化など) で初期化するので、そのままにしておきます。

SQlite3 は BLOB 処理に非常に優れています。

私のテストによると、FireDAC 挿入のタイミングはかなり良好で、SQlite3 への直接アクセスに非常に近いものです。TDataSetDelphiクラスのオーバーヘッドが原因で、読み取りのみが SQLite3 の直接リンクより遅くなります。

于 2013-10-03T12:08:11.227 に答える