1

私はAllenBrowneのConcatRelated関数を使用しており、データがテーブルからのものである場合は正常に機能しますが、データがクエリからのものである場合は機能しません。

緑色の「実行中のクエリ」バーが数秒間表示されますが、データを表示しようとすると、最初の行の1つのフィールドのみが表示され、実行速度が非常に遅く、レコードの最初の画面が表示されるまでに数分かかる場合があります。結果セットを完了するのに十分な時間放置できなかったため、タスクマネージャーを使用してAccessをシャットダウンする必要があります。

関数が呼び出されるたびにクエリが実行されますか?それはなぜそれがとても時間がかかるのか説明することができますが、ありそうもないようです。

これは、関数、関数を呼び出しているクエリ、またはソースデータの取得元のクエリに問題がありますか?

4

1 に答える 1

2

イミディエイトウィンドウでその関数を使用する例を次に示します。

CompanyID = 7
? ConcatRelated("OrderDate", "tblOrders", "CompanyID = " & CompanyID)
12/11/2012, 12/12/2012, 12/13/2012

関数 ...

  1. このSQLステートメントを作成します

    SELECT OrderDate FROM tblOrders WHERE CompanyID = 7

  2. Recordsetそのステートメントに基づいて開きます

  3. 各値を出力文字列にRecordset追加するループOrderDate

IOWは、ConcatRelated()呼び出すたびにかなりの作業を実行します。また、クエリのフィールド式として呼び出すと、クエリの結果セットの各行に対してすべての作業を再度実行する必要があります。

その「固定オーバーヘッド」にConcatRelated()加えて、追加のパフォーマンスコストが発生する可能性があります。インデックスがないCompanyID場合、dbエンジンは、の全表スキャンを使用して、句 tblOrdersを満たす行を見つける必要があります。WHERE

あなたの質問は、。を含むテーブルの代わりにクエリを使用することの影響について尋ねますConcatRelated()。その場合、関数の内部SQLステートメントは次のようになります。

SELECT OrderDate FROM YourQuery WHERE CompanyID  = 7

テーブルによって課せられるパフォーマンスの課題に加えて、さらにConCatRelated()2つのリスクがあり、ワークロードが劇的に増加する可能性があります。

  1. dbエンジンで多くの作業が必要な場合YourQueryは、親クエリの結果セットの各行を作成するためにその作業を行う必要があります。
  2. WHEREdbエンジンが、関数の内部SQLステートメントの句にインデックスを使用できない可能性が高くなります。CompanyIDの基になるテーブルソースにインデックスがある場合でもYourQuery、dbエンジンはそれを使用しても十分なメリットが得られない可能性があります。

したがって、ConCatRelated()便利ですが、使用するにはコストがかかります。これは、関数の設計エラーによるものではありません。むしろ、タスクの性質は、それを達成するためにどのアプローチを使用するかに関係なく、非常に高価です。そして、その関数にテーブルの代わりにクエリを使用するように要求すると、コストが高くなる可能性があります。

于 2012-12-13T16:14:51.287 に答える