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 mengaturROWS_PER_BATCH=
mengisyaratkan nilai yang sama. - menentukan
SqlBulkCopy.BatchSize
properti tidak aturROWS_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 bahwaORDER()
petunjuk tidak didukung olehSqlBulkCopy
.