私はこの構造を持っています:
WITH my_cte
AS
(
SELECT y.name
FROM
WHData.dbo.vw_data x
INNER JOIN WHData.dbo.vw_DimNames y
ON x.nameKey = y.CasinoKey
WHERE DateKey >= CONVERT(CHAR(8),DATEADD(mm,-2,GETDATE() - DAY(GETDATE())) + 1,112)--two complete months ago
GROUP BY y.name
)
SELECT *
FROM WHAnalysis.dbo.tb_otherData a
WHERE NOT EXISTS
(
SELECT 1
FROM my_cte b
WHERE b.name = a.name
);
コードをCTE
単独で実行すると、3 秒かかります。ただし、完全なスクリプトは実行して実行するだけです。
から離れてCTE
インデックス付き一時テーブルを使用すると、すべて 4 秒で実行されます。
私が想定しているのは、CTE
がデータの各レコードに対して実行されtb_otherData
ているため、2000 レコード、2000 x 3 秒かかるため、おそらく時間がかかりすぎるということです。
一時テーブルのソリューションは問題ありませんが、興味深いことに、CTE
コードを変更してすばやく実行する方法はありますか? CTE
私が見逃しているトリックはありますか?
編集
古き良きサブクエリに切り替えると、実行計画はまったく同じになります。
SELECT *
FROM WHAnalysis.dbo.tb_otherData a
WHERE name not in
(
SELECT y.name
FROM
WHData.dbo.vw_data x
INNER JOIN WHData.dbo.vw_DimNames y
ON x.nameKey = y.CasinoKey
WHERE DateKey >= CONVERT(CHAR(8),DATEADD(mm,-2,GETDATE() - DAY(GETDATE())) + 1,112)--two complete months ago
GROUP BY y.name
);