在我的存储过程中,我使用语法将数据插入到本地临时表(即#LocalTable
) 。SELECT INTO
我目前没有CREATE TABLE
为此表编写命令。
是否首选我明确编写CREATE TABLE
命令并定义列模式?SELECT INTO
在不定义模式的情况下使用方便的表是否有缺点?
在我的存储过程中,我使用语法将数据插入到本地临时表(即#LocalTable
) 。SELECT INTO
我目前没有CREATE TABLE
为此表编写命令。
是否首选我明确编写CREATE TABLE
命令并定义列模式?SELECT INTO
在不定义模式的情况下使用方便的表是否有缺点?
SELECT INTO 的一些缺点:
您可能会对数据类型/长度/精度/比例感到惊讶。
您可以保留源表中的 IDENTITY 属性,但并非总是如此(取决于源查询是否引用了多个表)。
如果没有显式创建,对于代码的其他维护者来说,select into 的存在可能更难发现,并且它还迫使他们对代码进行逆向工程以试图找出临时表的模式。
一些优点:
你会变得懒惰一次。
可能在某些情况下它的性能稍好一些,但如果您稍后要添加索引等,差异将可以忽略不计(并且不能证明我在这一点上所说的一切)。
我认为没有性能差异,但是当我必须为临时表创建索引时,我会使用 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 性能分析的了解还不够,无法知道哪种解决方案更快或哪种解决方案使用更少的资源。
希望能帮助到你。