众所周知,在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与多次插入。)
答案 0 :(得分:2)
不确定您使用的是哪个版本的SQL Server(2005或2008) - 但无论您使用哪个版本,我都认为在这种情况下使用CTE对于多个插入没有任何大的好处,老实说。 CTE确实适用于很多情况 - 但这不是其中之一。
基本上,我建议你只使用几个INSERT
语句。
在SQL Server 2008中,您可以通过仅指定多个值元组来简化这些:
INSERT INTO MyTable (MyField)
VALUES ('Hello'), ('World'), ('and outer space')
与往常一样,您的表结构,索引和触发器的存在(或不存在)确实会对您的INSERT速度产生重大影响。如果您需要加载大量数据,有时更容易在INSERT期间将这些约束和触发器关闭然后重新打开 - 但是再次:实际上没有办法让您清楚地指出您的情况是否属实具体情况与否 - 只有太多我们不知道的变量发挥了重要作用。测量它,比较它,为自己做出决定!