2012-03-29 34 views

回答

2

Performance-wise no。這只是更少的代碼來寫和更容易閱讀(在我看來)。

+1

實際上,如果通過網絡連接發送大量單獨的INSERT語句,可能會帶來顯着的性能優勢。有關示例,請參閱[我的答案](http://stackoverflow.com/a/25879264/2144390)。 – 2016-10-19 20:04:24

1

如果除了顯式類型的行以外,如果要插入多個數據列和SELECT,則表值構造函數將要求您單獨拼寫每列,而不是在使用一個INSERT語句時,您可以在SELECT中指定多個列。

例如:

USE AdventureWorks2008R2; 
GO 
CREATE TABLE dbo.MyProducts (Name varchar(50), ListPrice money); 
GO 
-- This statement fails because the third values list contains multiple columns in the subquery. 
INSERT INTO dbo.MyProducts (Name, ListPrice) 
VALUES ('Helmet', 25.50), 
     ('Wheel', 30.00), 
     (SELECT Name, ListPrice FROM Production.Product WHERE ProductID = 720); 
GO 

會失敗;你會做這樣的:

INSERT INTO dbo.MyProducts (Name, ListPrice) 
VALUES ('Helmet', 25.50), 
     ('Wheel', 30.00), 
     ((SELECT Name FROM Production.Product WHERE ProductID = 720), 
     (SELECT ListPrice FROM Production.Product WHERE ProductID = 720)); 
GO 

看到Table Value Constructor Limitations and Restrictions

-2

沒有性能優勢爲安倍提及。

列構造函數的順序是值(或select語句)的所需順序。您可以按任何順序列出列 - 值必須遵循該順序。

如果您意外地在select語句(或values子句)中切換列並且數據類型是兼容的,那麼使用columns構造將幫助您找到問題。

1

對這個問題的答案爲止一直非常誤導(和展示一個完整的心血不足/理解)作爲之間存在相當大的性能差異:

declare @numbers table (n int not null primary key clustered); 

insert into @numbers (n) 
values (0) 
    , (1) 
    , (2) 
    , (3) 
    , (4); 

declare @numbers table (n int not null primary key clustered); 

insert into @numbers (n) values (0); 
insert into @numbers (n) values (1); 
insert into @numbers (n) values (2); 
insert into @numbers (n) values (3); 
insert into @numbers (n) values (4); 

事實上,每一個insert聲明都有其自己的隱式事務保證了這一點。您可以通過查看每條語句的執行計劃或通過使用set statistics time on;對執行進行計時來輕鬆證明。對於每個單獨插入的「建立」和「拆除」上下文有一個固定成本,並且第二個查詢必須支付這個罰款五次,而第一次只支付一次。

不僅是列表的方法更有效,但你也可以用它來建立一個派生表:

select * 
from (values 
    (0) 
    , (1) 
    , (2) 
    , (3) 
    , (4) 
) as Numbers (n); 

這種格式都繞1000值限制,並允許您加入和之前過濾列表,被插入。有人可能會注意到我們根本沒有被綁定到insert聲明!作爲一個事實上的表格,這個結構可以在任何一個表格引用有效的地方使用。

+1

如果通過網絡連接發送大量單獨的INSERT語句,那麼也可能會帶來顯着的性能優勢。 – 2016-10-19 20:57:03

+0

@GordThompson絕對是。如果你使用單獨的語句在網絡上插入10,000行,那麼至少你浪費了240,000個字節來通過線路發送字符串'insert into'10,000次。在表格/列名稱之後添加的每個字符都是在我的帖子中寫入的任何內容開始應用之前必須發送,接收和解析的兩個字節... – Kittoes0124 2016-10-19 21:14:43