2

众所周知,CTE 是在 SQL Server 2005 中引入的,并且人群变得疯狂。

我有一个案例,我将大量静态数据插入到表中。我想知道的是以下哪个更快,以及我应该注意哪些其他因素。

INSERT INTO MyTable (MyField) VALUES ('Hello')
INSERT INTO MyTable (MyField) VALUES ('World')

或者

WITH MyCTE(Field1) AS (SELECT 'Hello' UNION SELECT 'World')
INSERT INTO MyTable (MyField) SELECT Field1 FROM MyCTE

我有一种不舒服的感觉,答案将取决于诸如触发器存在的东西MyTable……

(另外,我知道并且不在乎BULK INSERTCSV 和任何数量的其他方法客观上是更快更好的插入静态数据的方法。我特别想知道我应该注意的关于 CTE 与多个插入的问题。 )

4

1 回答 1

2

不确定您使用的是哪个版本的 SQL Server(2005 或 2008) - 但无论您使用哪个版本,老实说,在这种情况下,我认为在这种情况下使用 CTE 进行多次插入并没有什么大的好处。CTE 确实适用于很多情况 - 但这不是其中之一。

所以基本上,我建议你只使用几个INSERT语句。

在 SQL Server 2008 中,您可以通过指定多个值元组来简化这些:

INSERT INTO MyTable (MyField) 
VALUES ('Hello'), ('World'), ('and outer space')

与往常一样,您的表结构、索引和触发器的存在(或不存在)确实对您的 INSERT 速度有重大影响。如果您需要加载大量数据,有时在 INSERT 期间将这些约束和触发器关闭然后重新打开会更容易 - 但同样:实际上没有办法明确指示您的情况是否如此特定情况与否 - 太多我们不知道的变量起着重要作用。衡量它,比较它,自己做决定!

于 2009-11-30T06:32:35.920 回答