CTE与多个插入

时间:2009-11-30 05:52:36

标签: sql-server insert common-table-expression

众所周知,在SQL Server 2005中引入了CTE,人群疯狂。

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

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 INSERT CSV和任何其他方法是客观上更快和更好的插入静态数据的方法。我特别想知道我应该注意的问题使用CTE与多次插入。)

1 个答案:

答案 0 :(得分:2)

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

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

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

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

与往常一样,您的表结构,索引和触发器的存在(或不存在)确实会对您的INSERT速度产生重大影响。如果您需要加载大量数据,有时更容易在INSERT期间将这些约束和触发器关闭然后重新打开 - 但是再次:实际上没有办法让您清楚地指出您的情况是否属实具体情况与否 - 只有太多我们不知道的变量发挥了重要作用。测量它,比较它,为自己做出决定!