0

我想从 sp 中的物理表创建一个临时表结构。

我有两种方法

Select * into #temptable from MainTable where NULL=NULL

或者

Select * into #temptable from MainTable where 1=0

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

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

4

2 回答 2

3

此外,您可以使用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是,执行计划将是: 在此处输入图像描述

于 2012-05-13T11:41:46.273 回答
1

Select * into #temptable from MainTable where 1=0是正确的方法。虽然Select * into #temptable from MainTable where NULL=NULL给出了相同的结果,但最佳实践是必须使用IS运算符进行 NULL 比较。开发人员之间也1=0很常见比较。

于 2012-05-13T06:10:10.180 回答