2012-03-29 24 views

Trả lời

2

Không có hiệu suất. Nó chỉ là ít mã để viết và dễ đọc hơn (theo ý kiến ​​của tôi).

+1

Thực ra, có thể có lợi ích hiệu suất đáng kể nếu một số lượng lớn các câu lệnh INSERT riêng lẻ sẽ được gửi qua kết nối mạng. Xem [câu trả lời của tôi ở đây] (http://stackoverflow.com/a/25879264/2144390) để biết ví dụ. –

1

Nếu bạn sẽ chèn nhiều cột dữ liệu với SELECT ngoài các hàng được nhập rõ ràng, Trình tạo giá trị bảng sẽ yêu cầu bạn đánh vần từng cột riêng lẻ như trái ngược với khi bạn đang sử dụng một tuyên bố INSERT, bạn có thể chỉ định nhiều cột trong SELECT.

Ví dụ:

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 

sẽ thất bại; bạn sẽ phải làm điều đó như thế này:

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 

thấy Table Value Constructor Limitations and Restrictions

-2

Không có lợi ích hiệu suất như Abe nói.

Thứ tự của hàm tạo cột là thứ tự bắt buộc cho các giá trị (hoặc chọn câu lệnh). Bạn có thể liệt kê các cột theo thứ tự bất kỳ - các giá trị sẽ phải tuân theo thứ tự đó.

Nếu bạn vô tình chuyển đổi cột trong câu lệnh chọn (hoặc mệnh đề giá trị) và kiểu dữ liệu tương thích, việc sử dụng cột xây dựng sẽ giúp bạn tìm ra sự cố.

1

Những câu trả lời cho câu hỏi này cho đến nay đã được rất sai lầm (và chứng minh sự thiếu hoàn chỉnh các nỗ lực/sự hiểu biết) là có một sự khác biệt hiệu suất khá lớn giữa:

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); 

Thực tế là mỗi câu lệnh insert đơn lẻ đều có giao dịch ngầm riêng đảm bảo điều này. Bạn có thể tự mình chứng minh điều này bằng cách xem các kế hoạch thực hiện cho từng câu lệnh hoặc theo thời gian thực hiện bằng cách sử dụng set statistics time on;. Có một chi phí cố định liên quan đến "thiết lập" và "xé xuống" ngữ cảnh cho mỗi lần chèn riêng lẻ và truy vấn thứ hai phải trả tiền phạt này năm lần trong khi lần đầu tiên chỉ trả tiền một lần.

Không chỉ là phương pháp danh sách hiệu quả hơn nhưng bạn cũng có thể sử dụng nó để xây dựng một bảng có nguồn gốc:

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

Định dạng này được xung quanh giới hạn 1.000 giá trị và cho phép bạn tham gia và lọc danh sách của bạn trước khi nó được chèn vào. Người ta cũng có thể nhận thấy rằng chúng tôi không bị ràng buộc với tuyên bố insert! Là một bảng thực tế, cấu trúc này có thể được sử dụng ở bất kỳ nơi nào một tham chiếu bảng sẽ hợp lệ.

+1

Cũng có thể có một lợi ích hiệu suất đáng kể nếu một số lượng lớn các câu lệnh INSERT riêng lẻ sẽ được gửi qua kết nối mạng. –

+0

@GordThompson Chắc chắn nhất. Nếu bạn chèn 10.000 hàng trên mạng với các câu lệnh riêng lẻ thì tối thiểu, bạn đang lãng phí 240.000 byte cần thiết để chỉ gửi chuỗi 'chèn vào' trên dây 10.000 lần. Mỗi ký tự bạn thêm sau đó cho tên bảng/cột là hai byte khác phải được gửi, nhận và phân tích cú pháp trước khi bất kỳ nội dung nào được viết trong bài đăng của tôi ở trên bắt đầu áp dụng ... – Kittoes0124

Các vấn đề liên quan