2

サブクエリで関数を使用する t-sql でクエリを作成していて、2 つの質問に遭遇しました。次のような広告テーブルを想像してください。

AdID- Name

次のようなオプション テーブル:

OptionID - OptionName

そして、2 つの外部キー列を持つこれら 2 つの間のジャンク テーブル (AdvertisementOptionLink) :

AdID - OptionID

ユーザーがオプションを選択すると、広告を照会したいと思います。私は次のようなクエリを書きました:

SELECT * FROM Advertisement ad
INNER JOIN AdvertisementOptionLink aol
WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements)

現在、UDF_GetAdvertisements は、特定のオプションを持つ広告のリストを返すテーブル値関数です。

2 つの質問があります。

  1. この UDF_GetAdvertisements 関数は、各行のすべてのデータをクエリしますか? つまり、テーブルに 2000 件の広告がある場合、それらすべてをクエリしてすべての広告 ID を返すということですか? 関数の戻り値を変数に保存したほうがよいでしょうか?

2.このデータベースには、オプションのない広告がいくつかあります。ユーザーがオプションを選択しない場合、どのようにすればすべての広告を返すことができますか?

t-sql でテーブル値パラメーターを使用して、選択したオプション ID をストアド プロシージャ経由で渡します。このページから少し助けを借りました: http://www.sommarskog.se/arrays-in-sql-2008.html

4

1 に答える 1

2

実行計画を確認する必要があります。

WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements)

論理準結合演算子として実装されます。物理的な結合の種類は、マージ、ハッシュ、またはネストされたループのいずれかです。

マージ結合とハッシュ結合は、各入力を 1 回処理します。ネストされたループは、外側の入力を 1 回処理し、内側の入力を外側の入力の行数と同じ回数処理します。ただし、TVF がネストされたループ結合の内側に表示されている場合でも、TVF を繰り返し再評価するのではなく、結果がスプールにキャッシュされる可能性があります。

于 2012-11-14T19:52:00.127 に答える