イミディエイトウィンドウでその関数を使用する例を次に示します。
CompanyID = 7
? ConcatRelated("OrderDate", "tblOrders", "CompanyID = " & CompanyID)
12/11/2012, 12/12/2012, 12/13/2012
関数 ...
このSQLステートメントを作成します
SELECT OrderDate FROM tblOrders WHERE CompanyID = 7
Recordset
そのステートメントに基づいて開きます
- 各値を出力文字列に
Recordset
追加するループOrderDate
IOWは、ConcatRelated()
呼び出すたびにかなりの作業を実行します。また、クエリのフィールド式として呼び出すと、クエリの結果セットの各行に対してすべての作業を再度実行する必要があります。
その「固定オーバーヘッド」にConcatRelated()
加えて、追加のパフォーマンスコストが発生する可能性があります。インデックスがないCompanyID
場合、dbエンジンは、の全表スキャンを使用して、句 tblOrders
を満たす行を見つける必要があります。WHERE
あなたの質問は、。を含むテーブルの代わりにクエリを使用することの影響について尋ねますConcatRelated()
。その場合、関数の内部SQLステートメントは次のようになります。
SELECT OrderDate FROM YourQuery WHERE CompanyID = 7
テーブルによって課せられるパフォーマンスの課題に加えて、さらにConCatRelated()
2つのリスクがあり、ワークロードが劇的に増加する可能性があります。
- dbエンジンで多くの作業が必要な場合
YourQuery
は、親クエリの結果セットの各行を作成するためにその作業を行う必要があります。
WHERE
dbエンジンが、関数の内部SQLステートメントの句にインデックスを使用できない可能性が高くなります。CompanyID
の基になるテーブルソースにインデックスがある場合でもYourQuery
、dbエンジンはそれを使用しても十分なメリットが得られない可能性があります。
したがって、ConCatRelated()
便利ですが、使用するにはコストがかかります。これは、関数の設計エラーによるものではありません。むしろ、タスクの性質は、それを達成するためにどのアプローチを使用するかに関係なく、非常に高価です。そして、その関数にテーブルの代わりにクエリを使用するように要求すると、コストが高くなる可能性があります。