sql - 为什么 SELECT 到临时表然后 MERGE 并不比从源查询中 MERGE 慢?
问题描述
这是使用表值函数结果的 MERGE:
MERGE
Table1 d
USING
dbo.tvf_Table1(@StartDate, @EndDate) s ON d.ID = s.ID
WHEN MATCHED THEN UPDATE
SET Dest1 = Src1, Dest2 = Src2, Dest3 = Src3
WHEN NOT MATCHED THEN INSERT
VALUES(ID, Src1, Src2, Src3);
在我的环境中,大约需要 30 秒(平均超过 3 次运行)。
这是相同的 MERGE,但这次首先将函数结果放入临时表中:
SELECT
*
INTO
#Temp1
FROM
dbo.tvf_Table1(@StartDate, @EndDate)
MERGE
Table1 d
USING
#Temp1 s ON d.ID = s.ID
WHEN MATCHED THEN UPDATE
SET Dest1 = Src1, Dest2 = Src2, Dest3 = Src3
WHEN NOT MATCHED THEN INSERT
VALUES(ID, Src1, Src2, Src3);
DROP TABLE #Temp1
大约需要 31 秒(平均超过三轮)。
事实上,像上面这样运行 54 个 MERGE,使用临时表比没有使用临时表快大约 4 分钟。
接受这几乎不科学,我预计添加临时表步骤会显着减慢查询速度。毕竟,数据是从 A 移动到 B,然后从 B 移动到 C,而不是直接从 A 移动到 C。
可能导致这种情况的幕后发生了什么?
解决方案
与表值函数相比,临时表为优化器提供了更多的优化信息。
我可以理解您期望写入表的开销会减慢整体速度。但是,合并查询的其余部分也需要优化,知道表的确切大小有助于优化器改进整体计划。
推荐阅读
- python - 在 GTK+ 中嵌入带有 Matplotlib 的 IPython 7
- python - 通过 .at 和 MultiIndex 从 pd.DataFrame 中选择显式单元格
- android - 不变违规:requireNativeComponent:在 UIMana 中找不到“RNCViewPager”
- node.js - 在 ubuntu 上运行 express 应用程序时出错
- html - 样式文件更改未生效
- python - Python kivy、OpenCV 和 Flask 请求
- django - Django 如何在下一个请求中获取会话数据?
- c++ - 将字母转换为数字(a = 1,b = 2...)
- go - 在不忙等待或轮询的情况下等待多个回调超时
- javascript - 当我尝试将对象从 api 添加到我的 mongodb atlas db NODE JS 时,我得到了未定义