テーブル値関数(TVF)をCTE(非再帰的)に移動して、クエリへの変更をテストするように依頼されました。私の理解では、各CTE参照は別々に実行されるため、変更によってtempdbの競合が発生する可能性がありました...
CTEを使用すると、クエリのパフォーマンスが向上するのを見て非常に驚きました。 IE:
;WITH cte AS (
SELECT t.col FROM dbo.getValues() t)
SELECT ...
JOIN cte c ...
UNION ALL
SELECT ...
JOIN cte c ...
なぜこれが起こっているのか、誰かが光を当てることができますか?
CTEは複数回評価されることが「期待」されているという動作だと思いますが、常にそのように機能するとは限りません(たとえば、保証されていません)。おそらく、何らかの方法で動作を決定する変数はたくさんあります。実際の実行計画を共有できますか?