如何从sp中的源表快速填充临时表结构?

时间:2012-05-13 05:33:43

标签: sql sql-server

我想从sp。

中的物理表创建临时表结构

我有两种方法

Select * into #temptable from MainTable where NULL=NULL

Select * into #temptable from MainTable where 1=0

我在sp中创建了许多用于创建临时表结构的语句,因此有必要选择更好的临时表创建方法。

请让我知道创建高性能临时表的更好方法。

2 个答案:

答案 0 :(得分:3)

另外,您可以使用TOP(0)

SELECT  TOP(0) *
INTO    #TempTable
FROM    SourceTable

但在所有这三种情况下(SELECT TOP(0)WHERE NULL=NULLWHERE 1=0),执行计划都是相同的: enter image description here

在所有这些情况下,SQL Server将从查询优化阶段了解到这些查询在执行时不会生成行。因此,服务器将使用Constant Scan operator来代替从源表(Sales.SalesOrderHeader)中读取数据:

1)

  

[...]查询优化器可能知道没有记录可以满足谓词   甚至在触摸任何数据页面之前   (Source)

2)

  

矛盾检测是一种可识别何时识别的优化   查询是以这样的方式编写的,它永远不会返回任何行   所有。   (Source)

结论:您可以使用任何这些解决方案。

注意:仅当WHERE NULL=NULL时才可以使用SET ANSI_NULLS ON。如果ANSI_NULLS设置为OFF,那么WHERE NULL=NULL过滤器将始终为true,执行计划将为: enter image description here

答案 1 :(得分:1)

Select * into #temptable from MainTable where 1=0是正确的方法。尽管Select * into #temptable from MainTable where NULL=NULL给出了相同的结果,但最佳做法是必须与IS运算符进行NULL比较。此外,1=0比较在开发人员中也很常见。