在这个优秀的SO问题中,讨论了CTE和之间的sub-queries差异.
我想具体问一下:
在什么情况下,以下各项更有效/更快?
传统上,我temp tables在开发中使用了很多stored procedures- 因为它们看起来比许多交织在一起的子查询更具可读性.
Non-recursive CTEs非常好地封装数据集,并且非常易读,但是在某些情况下可以说它们总能表现得更好吗?或者是否必须总是摆弄不同的选项才能找到最有效的解决方案?
编辑
我最近被告知,就效率而言,临时表是一个很好的首选,因为它们具有相关的直方图即统计数据.
我对子查询的性能/加入另一个表有一个小问题
INSERT
INTO Original.Person
(
PID, Name, Surname, SID
)
(
SELECT ma.PID_new , TBL.Name , ma.Surname, TBL.SID
FROM Copy.Person TBL , original.MATabelle MA
WHERE TBL.PID = p_PID_old
AND TBL.PID = MA.PID_old
);
Run Code Online (Sandbox Code Playgroud)
这是我的SQL,现在这个东西运行大约100万次或更多.我的问题是什么会更快?
TBL.SID改为(Select new from helptable where old = tbl.sid) 要么
from并且加入where?edit1
嗯,这个脚本的运行次数和r个人一样多.
我的程序有2个模块,一个填充MaTabelle,一个传输数据.该程序确实将2个数据库合并在一起,因此有时会使用相同的密钥.
现在我正在研究一种没有重复密钥存在的解决方案.
我的解决方案是制作一个'HelpTable'.key(SID)的所有者生成一个新密钥并将其写入"HelpTable".使用此密钥的所有其他表都可以从"HelpTable"中读取它.
edit2
刚想到的东西:
如果一个表作为一个可以为null的键(外键没有链接)那么这将无法使用from或?
我一直在研究一种解决方案(在SQL Server中),其中所有没有异常的子查询都已使用临时表重写,以提高性能.
举个例子,所有的查询都是这样的:
SELECT something
FROM (SELECT * FROM T1 WHERE condition1)
JOIN ...
Run Code Online (Sandbox Code Playgroud)
被重写为这样:
SELECT *
INTO #tempTable
FROM T1
WHERE condition1
SELECT something
FROM #tempTable
JOIN ...
Run Code Online (Sandbox Code Playgroud)
这里还建议所有子查询都应该避免使用临时表.
基于给定的事实,是否应该用临时表替换所有子查询?如果不是什么时候应该考虑另一个?