5

テーブルの内容全体をできるだけ早くメモリに読み込みたい。私は Nexus データベースを使用していますが、Delphi のすべてのデータベース タイプに適用できるテクニックがいくつかあるかもしれません。

私が見ているテーブルには、20 列の 60,000 レコードがあります。したがって、巨大なデータセットではありません。

私のプロファイリングから、これまでに次のことがわかりました。

  • TnxTable を使用してテーブルに直接アクセスすることは、SQL クエリと 'SELECT * FROM TableName' を使用することよりも速くも遅くもありません。

  • 実際にデータを読み取ったりコピーしたりせずに、行をループするという単純な操作に、ほとんどの時間がかかります。

私が得ているパフォーマンスは

  • すべてのレコードをループすると 3.5 秒かかります
  • すべてのレコードをループし、値を読み取って保存すると、3.7 秒かかります (つまり、わずか 0.2 秒長くなります)。

私のコードのサンプル

var query:TnxQuery;
begin
    query.SQL.Text:='SELECT * FROM TableName';
    query.Active:=True;

    while not query.Eof do
        query.Next;

これには、60,000 行のテーブルで 3.5 秒かかります。

このパフォーマンスは合理的に聞こえますか? データをより速く読み取ることができる他のアプローチはありますか?

現在、同じコンピューター上のサーバーからデータを読み取っていますが、最終的には LAN 上の別のサーバーから読み取っている可能性があります。

4

1 に答える 1

7

最適な読み取り速度を得るには、TnxTable で BlockRead モードを使用する必要があります。

nxTable.BlockReadOptions := [gboBlobs, gboBookmarks];
//leave out gboBlobs if you want to access blobs only as needed
//leave out gboBookmarks if no bookmark support is required

nxTable.BlockReadSize := 1024*1024; //1MB
// setting block read size performs an implicit First
// while block read mode is active only calls to Next and First are allowed for navigation
try
  while not nxTable.Eof do begin
    // do something....
    nxTable.Next;
  end;
finally
  nxTable.BlockReadSize := 0;
end;

また、特定のインデックスに範囲を設定する必要がない場合は、できるだけ高速にアクセスできるようにシーケンシャル アクセス インデックスを使用してください。

于 2011-04-27T03:41:35.060 に答える