Tsql 我必须显式地创建临时表吗?

Tsql 我必须显式地创建临时表吗?,tsql,sql-server-2005,database-design,Tsql,Sql Server 2005,Database Design,在我的存储过程中,我使用SELECT into语法将数据插入到本地临时表(即LocalTable)中。我目前没有为此表编写CREATETABLE命令 我是否更愿意显式地编写CREATETABLE命令并定义列模式?在不定义模式的情况下使用方便的SELECT INTO表是否有缺点?我不认为有性能差异,但当我必须为临时表创建索引时,我使用它创建表并定义列模式。由于数据量大,这种技术可以大大提高速度 例如: CREATE TABLE #tmpTable(ID int not null) CREATE C

在我的存储过程中,我使用SELECT into语法将数据插入到本地临时表(即LocalTable)中。我目前没有为此表编写CREATETABLE命令


我是否更愿意显式地编写CREATETABLE命令并定义列模式?在不定义模式的情况下使用方便的SELECT INTO表是否有缺点?

我不认为有性能差异,但当我必须为临时表创建索引时,我使用它创建表并定义列模式。由于数据量大,这种技术可以大大提高速度

例如:

CREATE TABLE #tmpTable(ID int not null)
CREATE CLUSTERED INDEX Id_CI ON #tmpTable(ID ASC);

INSERT INTO #tmpTable
SELECT [....]
我认为,在使用表之前创建表会使代码更具可读性,但更严格

另一种方法是使用:

WITH tmpTable AS (
         SELECT [...]
    )

    [Command on tmpTable]   
END
我对SQL性能分析了解不够,不知道哪种解决方案更快,哪种使用更少的资源


希望有帮助。

选择进入的一些缺点:

您可能会对数据类型/长度/精度/比例感到惊讶

您可以保留源表的IDENTITY属性,但并不总是取决于源查询是否引用多个表

如果没有显式的create,对于代码的其他维护者来说,select-into的存在可能更难发现,而且它还迫使他们对代码进行反向工程,以尝试找出temp表的模式

一些优点:

你可以懒惰一次

在某些情况下,它的性能可能会稍好一些,但如果您稍后要添加索引等,那么这种差异将是可以忽略的,并且不能证明我在这一点上所说的所有其他内容都是正确的


请注意,CTE与临时表不同,因此严格来说,这不是直接的替代方案。一个常见的误解是CTE只计算一次,但只有当查询的其余部分只引用它一次时才是如此。它的行为更像一个视图,而不是一个临时表。我之所以将CTE作为一个备选方案,是因为您有一个对象在某种程度上可以与临时表相媲美,在存储过程执行期间处于活动状态,并在其执行后被销毁。我说得对吗?感谢@Aaron Bertrand的更正。不,临时表处于活动状态,直到您将其销毁或超出范围。CTE仅适用于创建它的语句。对不起,我不理解第2点。你能稍微扩展一下吗?谢谢你的帮助。如果您有一个指向您信任的文章的链接,那么我会做家庭作业并阅读它。@MADCookie好的,那么如果您有一个带有标识列的表,并且您确实选择了x.ID到foo中,并且在x.ID=y.ID;上从x内部连接y;,新表中的列将不是标识列。如果您将查询更改为返回完全相同的结果但from子句中只有一个表的查询,例如,将x.ID选择为foo from x(存在),从y中选择1,其中y.ID=x.ID;该临时表将有一个标识列。我说这是一个缺点,因为它不直观,如果你想显式地控制它,你应该使用CREATE TABLE。@MadCookie我假设你指的是第2点,因为有两个。