相关疑难解决方法(0)

CTE,子查询,临时表或表变量之间是否存在性能差异?

在这个优秀的SO问题中,讨论了CTE和之间的sub-queries差异.

我想具体问一下:

在什么情况下,以下各项更有效/更快?

  • CTE
  • 子查询
  • 临时表
  • 表变量

传统上,我temp tables在开发中使用了很多stored procedures- 因为它们看起来比许多交织在一起的子查询更具可读性.

Non-recursive CTEs非常好地封装数据集,并且非常易读,但是在某些情况下可以说它们总能表现得更好吗?或者是否必须总是摆弄不同的选项才能找到最有效的解决方案?


编辑

我最近被告知,就效率而言,临时表是一个很好的首选,因为它们具有相关的直方图即统计数据.

sql t-sql sql-server subquery common-table-expression

200
推荐指数
4
解决办法
12万
查看次数

表现:子查询或加入

我对子查询的性能/加入另一个表有一个小问题

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)

要么

  • 如果我将'HelpTable'添加到from并且加入where

edit1
嗯,这个脚本的运行次数和r个人一样多.

我的程序有2个模块,一个填充MaTabelle,一个传输数据.该程序确实将2个数据库合并在一起,因此有时会使用相同的密钥.
现在我正在研究一种没有重复密钥存在的解决方案.

我的解决方案是制作一个'HelpTable'.key(SID)的所有者生成一个新密钥并将其写入"HelpTable".使用此密钥的所有其他表都可以从"HelpTable"中读取它.

edit2
刚想到的东西:
如果一个表作为一个可以为null的键(外键没有链接)那么这将无法使用from或?

sql oracle

5
推荐指数
1
解决办法
1万
查看次数

是否应该用临时表替换所有子查询?

我一直在研究一种解决方案(在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)

这里还建议所有子查询都应该避免使用临时表.

基于给定的事实,是否应该用临时表替换所有子查询?如果不是什么时候应该考虑另一个?

sql sql-server query-performance

2
推荐指数
1
解决办法
2793
查看次数