我想从 sp 中的物理表创建一个临时表结构。
我有两种方法
Select * into #temptable from MainTable where NULL=NULL
或者
Select * into #temptable from MainTable where 1=0
我在 sp 中有许多创建临时表结构的语句,因此有必要选择更好的方法来创建临时表。
请让我知道创建高性能临时表的更好方法。
我想从 sp 中的物理表创建一个临时表结构。
我有两种方法
Select * into #temptable from MainTable where NULL=NULL
或者
Select * into #temptable from MainTable where 1=0
我在 sp 中有许多创建临时表结构的语句,因此有必要选择更好的方法来创建临时表。
请让我知道创建高性能临时表的更好方法。
此外,您可以使用TOP(0)
:
SELECT TOP(0) *
INTO #TempTable
FROM SourceTable
但是在所有这三种情况下(SELECT TOP(0)
, WHERE NULL=NULL
, WHERE 1=0
),执行计划都是一样的:
在所有这些情况下,SQL Server 将从查询优化阶段知道这些查询在执行时不会生成行。Sales.SalesOrderHeader
因此,服务器将使用Constant Scan
运算符,而不是从源表(在这种情况下)读取数据:
1)
[...] 查询优化器可能知道没有记录可以满足谓词,甚至在接触任何数据页之前 (来源)
2)
矛盾检测是一种优化,它可以识别何时以永远不会返回任何行的方式编写查询。 (来源)
结论:您可以使用任何这些解决方案。
注意:您WHERE NULL=NULL
只能在SET ANSI_NULLS ON
. 如果ANSI_NULLS
设置是,OFF
那么WHERE NULL=NULL
过滤器将始终true
是,执行计划将是:
Select * into #temptable from MainTable where 1=0
是正确的方法。虽然Select * into #temptable from MainTable where NULL=NULL
给出了相同的结果,但最佳实践是必须使用IS
运算符进行 NULL 比较。开发人员之间也1=0
很常见比较。