Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để nắm bắt dữ liệu được chuyển vào SqlBulkCopy bằng Sql Profiler?

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 INSERTOPENROWSET(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 đã đặt ROWS_PER_BATCH= gợi ý về cùng một giá trị.
  • chỉ định SqlBulkCopy.BatchSize tài sản đã không đặt ROWS_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 khi ORDER() gợi ý không được hỗ trợ bởi SqlBulkCopy .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trong SQL Server, cách tốt nhất để xác định xem một chuỗi đã cho có phải là XML hợp lệ hay không?

  2. Chuỗi kết nối máy chủ SQL - dấu chấm (.) Hoặc (cục bộ) hoặc (cục bộ)

  3. Gói dựa trên đặt chạy chậm hơn so với hàm có giá trị vô hướng với nhiều điều kiện

  4. Truy vấn đếm bắt buộc

  5. SQL:Cập nhật bảng trong đó cột =Nhiều Giá trị