最近この問題に遭遇しましたが、オンラインで議論することができませんでした。
以下のクエリ
DECLARE @S VARCHAR(1) = '';
WITH T
AS (SELECT name + @S AS name2,
*
FROM master..spt_values)
SELECT *
FROM T T1
INNER JOIN T T2
ON T1.name2 = T2.name2;
ネストされたループ計画を常に取得します
問題INNER HASH JOIN
またはINNER MERGE JOIN
ヒントで問題を強制しようとすると、次のエラーが生成されます。
このクエリで定義されたヒントのため、クエリプロセッサはクエリプランを作成できませんでした。ヒントを指定せずに、SET FORCEPLANを使用せずに、クエリを再送信します。
ハッシュ結合またはマージ結合の使用を許可する回避策を見つけました-変数を集約にラップします。生成された計画は大幅に低コストです(19.2025対0.261987)
DECLARE @S2 VARCHAR(1) = '';
WITH T
AS (SELECT name + (SELECT MAX(@S2)) AS name2,
*
FROM spt_values)
SELECT *
FROM T T1
INNER JOIN T T2
ON T1.name2 = T2.name2;
この動作の理由は何ですか?そして、私が見つけたものよりも良い回避策がありますか?(おそらく、追加の実行計画ブランチは必要ありません)