所有用于暂时存储数据。
是否有任何性能差异(时间和空间复杂度)这3种临时表?
性能问题应该取决于结果是否被保存在磁盘或存储。
我已经搜索了很多,但没有得到满意的答复。
CTE - 公用表表达式CTE代表公共表表达式。它与SQL Server 2005这是一个暂时的结果集,通常它可能是复杂的子查询的结果出台。不像临时表的生命是有限的,以当前查询。它是通过使用WITH语句来定义。 CTE改善了维护复杂的查询和子查询的可读性和易用性。始终以分号开始CTE。
With CTE1(Address, Name, Age)--Column names for CTE, which are optional
AS
(
SELECT Addr.Address, Emp.Name, Emp.Age from Address Addr
INNER JOIN EMP Emp ON Emp.EID = Addr.EID
)
SELECT * FROM CTE1 --Using CTE
WHERE CTE1.Age > 50
ORDER BY CTE1.NAME
当使用CTE?这是用于存储进一步使用复杂的子查询的结果。
这也可以用来创建一个递归查询。
临时表在SQL Server中,在运行时创建临时表,你可以做一切你可以在一个正常的表做操作。这些表是tempdb数据库中创建的。根据范围和行为的临时表有两种类型给出如下─
本地临时表局部临时表只适用于SQL Server会话或连接(指单个用户)创建的表。当创建该表的会话已经关闭这些被自动删除。本地临时表的名称盯着单散列(“#”)标志。
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Shailendra','Noida');
GO
Select * from #LocalTemp
本地临时表的范围存在于当前用户的当前会话意味着当前的查询窗口。如果您将关闭当前查询窗口或打开一个新的查询窗口,并会尝试找到上面创建临时表,它会给你的错误。
全局临时表全局临时表是提供给所有的SQL Server会话或连接(指所有的用户)。这些可以通过任何SQL Server连接用户创建,并在所有的SQL Server连接已被关闭,这些被自动删除。全局临时表名被盯着看,双哈希(“##”)的标志。
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Shailendra','Noida');
GO
Select * from ##GlobalTemp
而本地临时表是目前唯一的SQL Server连接可见全局临时表是所有SQL Server连接可见。
表变量此作用就像一个变量,存在对特定批次的查询执行的。一旦它出来一批就被丢弃。这也是在tempdb数据库中创建,但不是记忆。这也可以让你在表变量声明,但不是非聚集索引的时间创建主键,身份。
GO
DECLARE @TProduct TABLE
(
SNo INT IDENTITY(1,1),
ProductID INT,
Qty INT
)
--Insert data to Table variable @Product
INSERT INTO @TProduct(ProductID,Qty)
SELECT DISTINCT ProductID, Qty FROM ProductsSales ORDER BY ProductID ASC
--Select data
Select * from @TProduct
--Next batch
GO
Select * from @TProduct --gives error in next batch
注意临时表在tempdb数据库中创建物理。这些表充当正常表,并且还可以有限制,指数像正常的表。
CTE是一个命名的临时结果集,它被用来操纵复杂的子查询数据。这存在报表范围。这是在内存中,而不是tempdb数据库中创建的。您不能创建在任何CTE指数。
表变量的作用就像一个变量,存在对特定批次的查询执行的。一旦它出来一批就被丢弃。这也是在tempdb数据库中创建,但不是记忆。
相当广泛的话题,以覆盖所有的来龙去脉。这里有一些高水平的差别,这将使你研究这个更多的想法。
热膨胀系数是相同的查询的一部分,并应为非常类似于一个子查询被认为。甲CTE允许更好的可读性和代码重用(相同CTE可以在整个查询的不同部分中重复使用)。
表变量和临时表应该被看作是类似于真实的表,但与优化,使SQL服务器以相对较小的数据集用于快速尤其是当做出行动,打击他们。需要注意的是,虽然这些对tempdb中,这并不意味着这里存储的数据进行操作,实际上是保存在磁盘上。与SQL Server的每个新版本,也出现了更多的优化(例如内存优化表),以使这些结构更快,尤其是对于简化复杂的查询其主线使用情况。
关于这个主题的更多信息,请参阅本:https://www.brentozar.com/archive/2014/06/temp-tables-table-variables-memory-optimized-table-variables/