Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara menangkap data yang dikirimkan dalam SqlBulkCopy menggunakan Sql Profiler?

Menangkap info acara untuk operasi penyisipan massal ( BCP.EXE , SqlBulkCopy , dan saya berasumsi BULK INSERT , dan OPENROWSET(BULK... ) dimungkinkan, tetapi Anda tidak akan dapat melihat baris dan kolom satu per satu.

Operasi Penyisipan Massal muncul sebagai satu (baik, satu per batch, dan defaultnya adalah melakukan semua baris dalam satu batch) pernyataan DML dari:

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

Anda dapat menemukan daftar lengkap "petunjuk" di halaman MSDN untuk BCP Utilitas . Harap perhatikan bahwa SqlBulkCopy hanya mendukung sebagian dari petunjuk tersebut (mis. KEEP_NULLS , TABLOCK , dan beberapa lainnya) tetapi tidak mendukung ORDER(...) atau ROWS_PER_BATCH= (yang sangat disayangkan, sebenarnya, sebagai ORDER() petunjuk diperlukan untuk menghindari jenis yang terjadi di tempdb agar operasi dapat dicatat secara minimal (dengan asumsi kondisi lain untuk operasi semacam itu juga telah dipenuhi).

Untuk melihat pernyataan ini, Anda perlu merekam salah satu peristiwa berikut di SQL Server Profiler:

Anda juga ingin memilih, setidaknya, kolom berikut (dalam SQL Server Profiler):

Dan, karena pengguna tidak dapat mengirimkan INSERT BULK pernyataan secara langsung, Anda mungkin dapat memfilternya di Filter Kolom jika Anda hanya ingin melihat peristiwa ini dan tidak ada yang lain.

Jika Anda ingin melihat pemberitahuan resmi bahwa BULK INSERT operasi dimulai dan/atau berakhir, maka Anda perlu merekam peristiwa berikut:

lalu tambahkan kolom Profiler berikut:

Untuk ObjectName anda akan selalu mendapatkan acara yang menunjukkan "MASUKKAN BULK" dan apakah itu awal atau akhir ditentukan oleh nilai di EventSubClass , yaitu "0 - Begin" atau "1 - Commit" (dan saya rasa jika gagal, Anda akan melihat "2 - Rollback").

Jika ORDER() petunjuk tidak ditentukan (dan sekali lagi, itu tidak bisa ditentukan saat menggunakan SqlBulkCopy ), maka Anda juga akan mendapatkan acara "SQLTransaction" yang menampilkan "sort_init" di ObjectName kolom. Acara ini juga memiliki acara "0 - Begin" dan "1 - Commit" (seperti yang ditunjukkan di EventSubClass kolom).

Terakhir, meskipun Anda tidak dapat melihat baris tertentu, Anda masih dapat melihat operasi terhadap Log Transaksi (misalnya menyisipkan baris, mengubah baris IAM, memodifikasi baris PFS, dll.) jika Anda merekam peristiwa berikut:

dan tambahkan kolom Profiler berikut:

Info utama yang menarik ada di EventSubClass kolom, tetapi sayangnya itu hanya nilai ID dan saya tidak dapat menemukan terjemahan nilai-nilai itu dalam dokumentasi MSDN. Namun, saya menemukan posting blog berikut oleh Jonathan Kehayias:Menggunakan Extended Events di SQL Server Denali CTP1 untuk Memetakan TransactionLog SQL Trace Event Nilai EventSubClass .

@RBarryYoung menunjukkan bahwa nilai dan nama EventSubClass dapat ditemukan di sys.trace_subclass_values tampilan katalog, tetapi menanyakan tampilan tersebut menunjukkan bahwa tampilan tersebut tidak memiliki baris untuk TransactionLog acara:

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 :(

Harap perhatikan bahwa SqlBulkCopy.BatchSize properti setara dengan pengaturan -b opsi untuk BCP.EXE , yang merupakan pengaturan operasional yang mengontrol bagaimana setiap perintah akan memecah baris menjadi set. Ini tidak sama dengan ROWS_PER_BATCH= petunjuk yang tidak secara fisik mengontrol bagaimana baris dipecah menjadi set, tetapi sebaliknya memungkinkan SQL Server untuk merencanakan dengan lebih baik bagaimana ia akan mengalokasikan halaman, dan karenanya mengurangi jumlah entri dalam Log Transaksi (kadang-kadang cukup sedikit). Tetap saja pengujian saya menunjukkan bahwa:

  • menentukan -b untuk BCP.EXE apakah mengatur ROWS_PER_BATCH= mengisyaratkan nilai yang sama.
  • menentukan SqlBulkCopy.BatchSize properti tidak atur ROWS_PER_BATCH= petunjuk, TETAPI, manfaat dari pengurangan aktivitas Log Transaksi entah bagaimana pasti ada (ajaib?). Fakta bahwa efek bersihnya adalah tetap mendapatkan keuntungan adalah mengapa saya tidak menyebutkannya di atas ketika saya mengatakan bahwa sangat disayangkan bahwa ORDER() petunjuk tidak didukung oleh 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. SQL Server ODBC Driver tidak memunculkan kesalahan

  2. Koneksi SQL Server ke node js

  3. Bagaimana saya bisa melihat semua karakter khusus yang diizinkan di bidang varchar atau char di SQL Server?

  4. Bagaimana cara menggunakan penghapusan kaskade dengan SQL Server?

  5. Apa perbedaan dalam dua kueri ini karena mendapatkan dua set hasil yang berbeda?