我想从sp。
中的物理表创建临时表结构我有两种方法
Select * into #temptable from MainTable where NULL=NULL
或
Select * into #temptable from MainTable where 1=0
我在sp中创建了许多用于创建临时表结构的语句,因此有必要选择更好的临时表创建方法。
请让我知道创建高性能临时表的更好方法。
答案 0 :(得分:3)
另外,您可以使用TOP(0)
:
SELECT TOP(0) *
INTO #TempTable
FROM SourceTable
但在所有这三种情况下(SELECT TOP(0)
,WHERE NULL=NULL
,WHERE 1=0
),执行计划都是相同的:
在所有这些情况下,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
,执行计划将为:
答案 1 :(得分:1)
Select * into #temptable from MainTable where 1=0
是正确的方法。尽管Select * into #temptable from MainTable where NULL=NULL
给出了相同的结果,但最佳做法是必须与IS
运算符进行NULL比较。此外,1=0
比较在开发人员中也很常见。