我是否必须明确地创建#temp表?

时间:2013-07-24 23:43:26

标签: tsql sql-server-2005 database-design

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

我是否首选显式编写CREATE TABLE命令并定义列架构?在没有定义架构的情况下使用方便的SELECT INTO表有缺点吗?

2 个答案:

答案 0 :(得分:5)

SELECT INTO的一些缺点:

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

  2. 您可以从源表中保留IDENTITY属性,但不总是(取决于源查询是否引用多个表)。

  3. 没有显式创建的
  4. ,对于代码的其他维护者来说,select into的存在可能更难以发现,并且它还迫使他们对代码进行反向工程以试图找出临时表的模式

  5. 一些优点:

    1. 你会变懒。

    2. 可能会出现稍微好一点的情况,但如果你以后要添加索引等,差异可以忽略不计(并且不能证明我在这一点上所说的其他一切)

答案 1 :(得分:0)

我不认为存在性能差异,但是当我必须为临时表创建索引时,我使用CREATE TABLE并定义列模式。通过大量数据,这种技术可以大大提高速度。

例如:

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性能分析,知道什么解决方案更快或哪个解决方案使用的资源更少。

希望它有所帮助。