2009-11-30 49 views
2

众所周知,CTE是在SQL Server 2005中引入的,人群疯狂。CTE vs多插入

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

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存在...

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

+2

简单的解决方案:测试测试测试和测量!在远离你的系统,磁盘布局,桌面布局等情况下,你真的很难说。版本,触发器等等都会发挥作用。所以真的:只有**你**可以通过测试和测量这两种方法来判断..... – 2009-11-30 05:54:12

+0

marc_s,yes测试和分析总是最好的方式来得到你的确切情况的答案,但我是寻找一些更一般的趋势和考虑因素,以便记住。 – Matthew 2009-12-01 04:51:13

回答

2

不知道您使用的是哪个版本的SQL Server(2005或2008) - 但无论您使用的是哪个版本,坦白地说,在这种情况下使用CTE对于多次插入没有任何好处。 CTE对于许多情况确实很棒 - 但这不是其中之一。

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

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

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

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

+0

+1:我之前与Quassnoi的聊天表明,使用CTE与内联视图没有提高速度。 – 2009-11-30 06:42:12

+0

@OMGPonies:我会支持这一点 - 但有时候,我发现CTE比复杂的嵌套内联视图更易读,更容易理解。没有性能好处本身,但更容易阅读 – 2009-11-30 09:18:20

+0

@OMGPonies,我故意排除像临时表这样的东西,但我没有想到内联视图。好点子。你能给你提到的聊天提供一个链接吗? @marc_s,我没有意识到SQL 2008的新语法。谢谢! – Matthew 2009-12-01 21:48:45