3

さまざまなパラメーターを使用して SQL データベースに繰り返しクエリを実行する既存のコードがいくつかあります。最初にデータの大きなチャンクを ADODB.Recordset に選択するように変更し、ループ クエリ内でこれを変更すると、パフォーマンスが向上する可能性が高いと考えました。データベース自体ではなく、レコードセット。

もう 1 つの注意点は、これらのサブクエリを実行するときに集計関数 (SUM、MIN、MAX、AVG) を使用する必要があることです。

これをコーディングするのはさほど難しいことではありませんが、これほど明らかなことは以前に何千回も行われているように思えます。この種の機能を含む何らかのオープン ソース ライブラリが存在するのではないかと思います。数年前に遭遇したことを誓いますが、Googleで追跡することはできません.

編集:
コメントの良い提案 (TimW による) は、データベース サーバーですべての集計を行い、クライアントに戻してから、クライアントでフィルタリングを行うことでした。(ただし、この場合は機能しません。フィルターが適用されている列のうち 2 つが DateTime 列であるため)

アップデート

以前に遭遇したライブラリは次のとおりです:
http://code.google.com/p/ado-dataset-tools/

作者がそれを放棄したかどうかは定かではありません (彼の計画は、それを更新して c# に変換することだったようです)。しかし、さまざまなライブラリの VBA バージョンは、 http ://code.google.com/p で入手できるようです。
/ado-dataset-tools/source/browse/trunk/ado-recordset-unit-tests.xls?spec=svn8&r=8#ado-recordset-unit-tests.xls

私が興味を持った特定の ADO ライブラリはここにあります:
http://code.google.com/p/ado-dataset-tools/source/browse/trunk/ado-recordset-unit-tests.xls/SharedRecordSet.bas

特にGroupRecordSet()関数を参照してください。
SUM、MIN、MAX 集計関数のみがサポートされているようです。

別の可能な代替手段 (Excel 内で実行している場合)


Excel VBA
仮想テーブルに対する SQL クエリを書くExcel でワークシートを作成し、その後のクエリでそのワークシートをデータソースとして使用することが実行可能なオプションになる場合があります。

4

3 に答える 3

2

私自身の経験では、大量のデータをレコードセットにロードしてからそのデータをフィルタリング/クエリするよりも、データベースに対して多くの小さな呼び出しを行う方が実際にははるかに効率的です。

また、データベースを個別に呼び出す場合に比べて、既存の ADO レコードセット内のデータをフィルター処理/クエリする機能がかなり制限されているという印象を受けます。これをやろうとしていたとき、SQL を使用して最初の ADO レコードセットにクエリを実行して、2 つ目の ADO レコードセットを作成するのと同じくらい簡単だと思っていました。私はそれを行う方法を見つけたことがありません。私はそれが不可能だと確信しています。

Edit1
違いを理解しやすくするために、テキスト ファイルから新しい価格データを読み取り、ADO と VFP OLE ドライバーを使用して Visual Foxpro データベースの価格を更新するコードをいくつか書きました。クエリを実行していたテーブルには、約 650,000 のレコードがありました。レコードセット内のすべてのレコードをロードしてから、ADO のフィルター メソッドを使用するのが最善であると考えました。これを行ったとき、コードを実行するのに 3 ~ 4 時間かかりました。一度に 1 つずつ各レコードを参照するようにコードを変更すると、コードは 1 分 2 秒で実行されました。この問題について SO に投稿しました。私が受け取ったさまざまな応答を見ることができます:この検索/フィルター操作を高速化する - (VB6、TextFile、ADO、VFP 6.0 データベース)

于 2012-04-05T16:21:53.317 に答える
1

パフォーマンスの問題が低速接続を介したリモート SQL Server データベースに起因する場合、データを集中的に処理する必要がある場合は、ローカル キャッシュがある程度有効な場合があります。

汎用性を高める 1 つの方法は、ローカルの Jet MDB をキャッシュとして使用することです。

Jet を使用して最初の「キャッシュ」クエリを実行し、リモートの外部 SQL Server データベースからローカル テーブルに SELECT を実行してから、その上にインデックスを作成することができます。そこから、ローカル テーブルに対して任意の数の後続のクエリを実行できます。別のサブセットを操作する必要がある場合は、ローカル テーブルとインデックスを削除し、リモート データベースに再クエリを実行します。

ただし、リモート接続パスが遅い場合を除き、これは通常、それほどメリットがありません。

于 2012-04-05T17:16:11.387 に答える
0

このテーマに関する私の調査によると、簡単な解決策や既存のライブラリや商用製品はありません。私が言うことができる唯一の実行可能な解決策は、弾丸をかじって解決策を手作業でコーディングすることです。これは、私にとって価値があるよりも多くの作業です。

したがって、問題の解決策ではないにもかかわらず、これを正解としてマークしています。:)

于 2012-04-10T16:13:47.703 に答える