2010-08-25 23 views
6

Cuối cùng tôi đã nhận được đợt chèn của tôi để làm việc và bây giờ tôi đã được fiddling với kích thước của lô, nhưng tôi không thể thấy bất kỳ sự khác biệt trong hiệu suất giữa một giá trị 50 và một giá trị 10000. Điều này có vẻ rất kỳ quặc với tôi, nhưng tôi không biết chuyện gì đang xảy ra đằng sau hiện trường, vì vậy nó có thể là hành vi bình thường.Làm cách nào để đặt DataAdapter.UpdateBatchSize thành giá trị "tối ưu"?

Tôi đang chèn 160 nghìn hàng vào một bảng và thời gian trung bình cho các giá trị thử nghiệm của tôi là 115 +/- 2 giây. Nếu không có hàng loạt phải mất 210 giây, vì vậy tôi khá hài lòng với sự cải thiện. Bảng mục tiêu là:

CREATE TABLE [dbo].[p_DataIdeas](
    [wave] [int] NOT NULL, 
    [idnumber] [int] NOT NULL, 
    [ideaID] [int] NOT NULL, 
    [haveSeen] [bit] NOT NULL CONSTRAINT [DF_p_DataIdeas_haveSeen] DEFAULT ((0)), 
    CONSTRAINT [PK_p_DataIdeas] PRIMARY KEY CLUSTERED 
(
    [wave] ASC, 
    [idnumber] ASC, 
    [ideaID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON 
) ON [PRIMARY] 
) ON [PRIMARY] 

Tôi đọc What to look for when setting UpdateBatchSize và câu trả lời chỉ đơn giản là thử nghiệm một vài giá trị khác nhau. Tôi có thể hiểu điều đó, nhưng không nên tính toán hay ít nhất là đánh giá cao một giá trị tốt nếu bạn biết thiết kế bảng, câu hỏi SQL và dữ liệu sắp được chèn vào?

Có bất kỳ phương pháp hay nhất nào ở đó mà ai đó có thể đề xuất không?

Trả lời

5

Bạn có thể thấy ảnh hưởng của việc tạo đợt bằng cách xem SQL Profiler hoặc bằng cách gọi SqlConnection.RetrieveStatistics(). Những gì bạn sẽ thấy là mỗi lô tương ứng với một chuyến đi khứ hồi duy nhất đến DB. Theo như cách tối ưu hóa kích thước lô, quy tắc rất thô là hiệu suất có xu hướng ngừng cải thiện với kích thước lô trên khoảng 50 - trên thực tế, đôi khi các lô lớn hơn có thể chạy chậm hơn so với kích thước nhỏ hơn . Nếu tôi quá bận rộn để kiểm tra, tôi thường bắt đầu với một loạt khoảng 20 (trừ khi tôi đang sử dụng các tham số có giá trị bảng, trong đó các lô lên đến 500 có thể nhanh hơn các gói nhỏ hơn). Tuy nhiên, số lượng tối ưu phụ thuộc vào những thứ như kích thước tổng của chèn (tất cả chúng sẽ phù hợp với RAM), tốc độ ghi đĩa của nhật ký DB của bạn, cho dù nhật ký nằm trên ổ đĩa/LUN của riêng nó (Nếu không, thì

Tốc độ đạt được thường bị giới hạn trước bởi số chuyến đi khứ hồi, sau đó kích thước giao dịch, sau đó là tốc độ đĩa ghi (đặc biệt là truy cập tuần tự hay có thể do cạnh tranh với các tệp khác trên cùng một cọc) và cuối cùng là RAM. Tuy nhiên, tất cả các yếu tố cũng liên quan đến nhau ở một mức độ nào đó.

Bước đầu tiên trong việc cải thiện mức độ hoàn hảo của chèn của bạn sẽ là thực hiện chúng trong các giao dịch - có thể là một giao dịch cho mỗi một hoặc hai giao dịch. Ngoài ra, các tham số có giá trị bảng có lẽ là bước tiếp theo, sử dụng một thủ tục được lưu trữ với INSERT INTO Table SELECT column FROM @TableArgument.

1

Mặc dù việc thay đổi UpdateBatchSize sẽ giúp một mức độ nào đó, cách tiếp cận cơ bản của việc sử dụng một DataAdapter để cập nhật nhiều bản ghi sẽ chậm. Điều này là do cuối cùng, một câu lệnh SQL riêng biệt (chèn, cập nhật hoặc xóa) sẽ được tạo ra bởi DataAdapter cho mỗi hàng. UpdateBatchSize chỉ ảnh hưởng đến số lượng các câu lệnh riêng lẻ được gửi trong một TSQL Batch khi được gửi đến SQL Server.

Để có được nhiều cải tiến lớn hơn về hiệu suất, bạn muốn SQLServer chèn/cập nhật/xóa nhiều bản ghi trong một câu lệnh (thường sử dụng JOIN của một số loại). Bảng tham số có giá trị (như được đề cập bởi RickNZ) là một cách để làm điều này. Một khả năng khác là sử dụng SqlBulkCopy (mặc dù bạn thường sẽ cần phải sử dụng một bảng dàn dựng cho việc này).

0

Đảm bảo rằng cũng có một giao dịch hoạt động, nó sẽ cải thiện hiệu suất rất nhiều (khoảng 30x trong các thử nghiệm của tôi bằng cách sử dụng MysqlDataAdapter).

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