相关疑难解决方法(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万
查看次数

为什么临时表和子选择之间存在巨大的性能差异

这是一个关于SQL Server 2008 R2的问题

到目前为止,我不是DBA.我是一名java开发人员,必须不时编写SQL.(主要嵌入代码中).我想知道我在这里做错了什么,如果是的话,我可以做些什么来避免它再次发生.

Q1:

SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ...
Run Code Online (Sandbox Code Playgroud)

Q1有14个连接

Q2与Q1相同,但有一个例外.(SELECT*FROM T1 WHERE condition1)之前执行,并存储在临时表中.

这不是相关的子查询.

Q2:

SELECT * INTO #tempTable FROM T1 WHERE condition1
SELECT something FROM #tempTable  JOIN ...
Run Code Online (Sandbox Code Playgroud)

再次,14加入.

现在让我感到困惑的是,Q1花了> 2分钟(尝试了几次,以避免缓存发挥作用),而Q2(两个查询合并)花了2秒!是什么赋予了?

sql sql-server-2008-r2 query-performance

36
推荐指数
2
解决办法
6万
查看次数

为什么使用临时表比嵌套查询更快?

我们正在尝试优化一些查询.

一个查询正在执行以下操作:

SELECT t.TaskID, t.Name as Task, '' as Tracker, t.ClientID, (<complex subquery>) Date,
INTO [#Gadget]
FROM task t

SELECT TOP 500 TaskID, Task, Tracker, ClientID, dbo.GetClientDisplayName(ClientID) as Client 
FROM [#Gadget]
order by CASE WHEN Date IS NULL THEN 1 ELSE 0 END , Date ASC

DROP TABLE [#Gadget]
Run Code Online (Sandbox Code Playgroud)

(我已经删除了复杂的子查询.除了解释为什么这个查询已经作为一个两阶段过程完成之外,我认为它不相关.)

认为使用子查询将其合并为单个查询会更有效率:

SELECT TOP 500 TaskID, Task, Tracker, ClientID, dbo.GetClientDisplayName(ClientID)
FROM
(
    SELECT t.TaskID, t.Name as Task, '' as Tracker, t.ClientID, (<complex subquery>) Date,
    FROM task t
) as …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization query-optimization

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