Thu thập thông tin sự kiện cho các hoạt động chèn hàng loạt (BCP.EXE
, SqlBulkCopy
và tôi giả sử BULK INSERT
và OPENROWSET(BULK...
) là có thể, nhưng bạn sẽ không thể thấy các hàng và cột riêng lẻ.
Các hoạt động Chèn hàng loạt hiển thị dưới dạng một (tốt, một mỗi lô và mặc định là thực hiện tất cả các hàng trong một lô duy nhất) câu lệnh DML của:
INSERT BULK <destination_table_name> (
<column1_name> <column1_datatype> [ COLLATE <column1_collation> ], ...
) [ WITH (<1 or more hints>) ]
<hints> := KEEP_NULLS, TABLOCK, ORDER(...), ROWS_PER_BATCH=, etc
Bạn có thể tìm thấy danh sách đầy đủ các "gợi ý" trên trang MSDN cho BCP Tiện ích
. Xin lưu ý rằng SqlBulkCopy chỉ hỗ trợ một tập hợp con của những gợi ý đó (ví dụ:KEEP_NULLS
, TABLOCK
và một số khác) nhưng không không hỗ trợ ORDER(...)
hoặc ROWS_PER_BATCH=
(thực ra khá đáng tiếc là ORDER()
gợi ý là cần thiết để tránh sắp xếp xảy ra trong tempdb để cho phép thao tác được ghi lại ở mức tối thiểu (giả sử các điều kiện khác cho thao tác như vậy cũng đã được thỏa mãn).
Để xem câu lệnh này, bạn cần nắm bắt bất kỳ sự kiện nào sau đây trong SQL Server Profiler:
Bạn cũng sẽ muốn chọn, ít nhất, các cột sau (trong SQL Server Profiler):
Và, vì người dùng không thể gửi BULK INSERT
trực tiếp, bạn có thể có thể lọc trên đó trong Bộ lọc cột nếu bạn chỉ muốn xem những sự kiện này và không có gì khác.
Nếu bạn muốn xem thông báo chính thức rằng BULK INSERT
hoạt động đang bắt đầu và / hoặc kết thúc, khi đó bạn cần nắm bắt sự kiện sau:
và sau đó thêm các cột Hồ sơ sau:
Đối với ObjectName
bạn sẽ luôn nhận được các sự kiện hiển thị "BULK INSERT" và việc bắt đầu hay kết thúc được xác định bởi giá trị trong EventSubClass
, là "0 - Bắt đầu" hoặc "1 - Cam kết" (và tôi cho rằng nếu không thành công, bạn sẽ thấy "2 - Khôi phục").
Nếu ORDER()
gợi ý không được chỉ định (và một lần nữa, nó không thể được chỉ định khi sử dụng SqlBulkCopy
), thì bạn cũng sẽ nhận được sự kiện "SQLTransaction" hiển thị "sort_init" trong ObjectName
cột. Sự kiện này cũng có các sự kiện "0 - Bắt đầu" và "1 - Cam kết" (như được hiển thị trong EventSubClass
cột).
Cuối cùng, mặc dù bạn không thể thấy các hàng cụ thể, bạn vẫn có thể thấy các hoạt động đối với Nhật ký giao dịch (ví dụ:chèn hàng, sửa đổi hàng IAM, sửa đổi hàng PFS, v.v.) nếu bạn nắm bắt được sự kiện sau:
và thêm cột Hồ sơ sau:
Thông tin quan tâm chính sẽ có trong EventSubClass
, nhưng rất tiếc đó chỉ là các giá trị ID và tôi không thể tìm thấy bất kỳ bản dịch nào của các giá trị đó trong tài liệu MSDN. Tuy nhiên, tôi đã tìm thấy bài đăng trên blog sau đây của Jonathan Kehayias: Sử dụng Sự kiện mở rộng trong SQL Server Denali CTP1 để lập bản đồ Sự kiện theo dõi SQL TransactionLog Giá trị EventSubClass
.
@RBarryYoung đã chỉ ra rằng các giá trị và tên EventSubClass có thể được tìm thấy trong sys.trace_subclass_values
chế độ xem danh mục, nhưng truy vấn chế độ xem đó cho thấy rằng nó không có hàng cho TransactionLog
sự kiện:
SELECT * FROM sys.trace_categories -- 12 = Transactions
SELECT * FROM sys.trace_events WHERE category_id = 12 -- 54 = TransactionLog
SELECT * FROM sys.trace_subclass_values WHERE trace_event_id = 54 -- nothing :(
Xin lưu ý rằng SqlBulkCopy.BatchSize
thuộc tính tương đương với việc đặt -b
tùy chọn cho BCP.EXE , là một cài đặt hoạt động kiểm soát cách mỗi lệnh sẽ chia các hàng thành các tập hợp. Điều này không giống với ROWS_PER_BATCH=
gợi ý không kiểm soát vật lý cách các hàng được chia thành các tập hợp, nhưng thay vào đó cho phép SQL Server lập kế hoạch tốt hơn cách nó sẽ phân bổ các trang và do đó giảm số lượng mục nhập trong Nhật ký giao dịch (đôi khi khá một chút). Vẫn thử nghiệm của tôi cho thấy rằng:
- chỉ định
-b
cho BCP.EXE đã đặtROWS_PER_BATCH=
gợi ý về cùng một giá trị. - chỉ định
SqlBulkCopy.BatchSize
tài sản đã không đặtROWS_PER_BATCH=
gợi ý, NHƯNG, lợi ích của việc giảm hoạt động Nhật ký giao dịch bằng cách nào đó chắc chắn là có (ma thuật?). Thực tế là hiệu quả ròng vẫn đạt được lợi ích là lý do tại sao tôi không đề cập đến nó ở đầu khi tôi nói rằng thật không may khiORDER()
gợi ý không được hỗ trợ bởiSqlBulkCopy
.