2011-08-17 31 views
10

Tôi đang thực hiện một số thử nghiệm trên máy chủ sql và tôi muốn có được tốc độ chèn tốt nhất có thể. Tuyên bố tôi sử dụng là một cái gì đó như thế này:Sql chèn tốc độ lên

INSERT INTO db_Test_databse..tbl_test with(rowlock) 
    ( joinid, date_key, 
     col1, col2,col3,col4, col5, col6, col7, col8, col9, col10, ...  
    ) 

SELECT tabid as joinid, 
     date_key, 
     rec_type, 
     col2, 
     dbo.udf_convert_hex_to_dec(col3), 
     col4, col5, col6, col7, col8, 
     dbo.udf_convert_hex_to_dec(col9), 
     dbo.udf_convert_hex_to_dec(col10), 
     ... 
from source_table f 

Có 25 cột; hầu hết trong số đó là loại bigint hoặc int.

Tôi đã xóa tất cả các chỉ mục khỏi bảng đích trừ khóa chính là trường nhận dạng.

Bất kỳ mẹo nào về cách cải thiện hiệu suất nhiều hơn?

P.s. Ở dạng này tôi có tốc độ trung bình 16.000 hàng/giây.

+0

'dbo.udf_convert_hex_to_dec' đang giết chết bạn. Bạn đang sử dụng phiên bản SQL Server nào? Có tích hợp để thực hiện chuyển đổi này. – Yuck

+0

Tôi đang nghi ngờ tại hàm 'udf_convert_hex_to_dec'. Chèn chỉ có thể được thực hiện nhanh hơn đến một điểm, một số yếu tố là chỉ số và hiệu suất IO vật lý.Chạy một phân tích truy vấn đối với nó, tôi đặt cược chọn là phần chậm vì chức năng. –

+2

Chức năng do người dùng xác định có thể chậm. Bạn có thể không đưa hex trực tiếp vào thập phân - CAST (col9 AS Decimal (4)) chẳng hạn>? – Simon

Trả lời

14

Để tận dụng tốt nhất hiệu suất tốt bạn nên:

  • Hủy bỏ tất cả các trigger và những hạn chế trên bàn
  • Hủy bỏ tất cả các chỉ số, trừ các đối tượng cần thiết bằng cách chèn
  • Đảm bảo chỉ số nhóm của bạn là như vậy mà các bản ghi mới sẽ luôn được chèn vào cuối bảng (một cột nhận dạng sẽ làm tốt). Điều này ngăn cản phân chia trang (nơi SQL Server phải di chuyển dữ liệu xung quanh vì trang hiện tại đã đầy)
  • Đặt fill factor thành 0 hoặc 100 (chúng tương đương) sao cho không có khoảng trống trong bảng. dữ liệu được trải đều.
  • Thay đổi recovery model của cơ sở dữ liệu thành Đơn giản, giảm chi phí cho nhật ký giao dịch.

Có nhiều khách hàng chèn bản ghi song song không? Nếu vậy thì bạn cũng nên điều chỉnh các tác động khóa.

Lưu ý rằng SQL Server có thể đề xuất các chỉ mục cho một truy vấn cụ thể là by executing the query in SQL Server Management Studio hoặc thông qua Database Engine Tuning Advisor. Bạn nên làm điều này để đảm bảo rằng bạn chưa xóa chỉ mục mà SQL Server đang sử dụng để tăng tốc độ INSERT.

Nếu điều này vẫn không đủ nhanh thì bạn nên xem xét nhóm lên chèn một sử dụng BULK INSERT thay vì (hoặc một cái gì đó giống như bcp utility hoặc SqlBulkCopy, cả hai đều sử dụng BULK INSERT dưới bìa). Điều này sẽ cung cấp thông lượng cao nhất khi chèn hàng.

Cũng thấy Optimizing Bulk Import Performance - phần lớn lời khuyên trong bài viết đó cũng áp dụng cho chèn "bình thường".

+0

Như tôi đã nói tôi chỉ có một chỉ mục là khóa chính và không có trình kích hoạt. Tôi sẽ cố gắng sử dụng phương pháp BULK INSERT. –

+0

Sắp xếp truy vấn nguồn đến chỉ mục nhóm trên mục tiêu. – Paparazzi

+0

Thay vì thay đổi mô hình khôi phục thành Đơn giản, hãy thay đổi mô hình thành [BULK_LOGGED] (http://msdn.microsoft.com/en-us/library/ms189275 (v = sql.110) .aspx). Bạn có thể thay đổi lại sau khi thao tác hàng loạt. – CFreitas

1

Bạn đã cân nhắc sử dụng SqlBulkCopy chưa? Bạn cần phải xây dựng một DataTable và chuyển nó vào thường trình WriteToServer.

Đó là FAST!

1

bạn có thể sử dụng trong thủ tục cửa hàng của bạn trước khi kết thúc

OPTION(RECOMPILE)