web-dev-qa-db-ja.com

CTEはシンタックスシュガーだと思った

テーブル値関数(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 ...

なぜこれが起こっているのか、誰かが光を当てることができますか?

1
OMG Ponies

CTEは複数回評価されることが「期待」されているという動作だと思いますが、常にそのように機能するとは限りません(たとえば、保証されていません)。おそらく、何らかの方法で動作を決定する変数はたくさんあります。実際の実行計画を共有できますか?

4
Aaron Bertrand