Indsamling af hændelsesoplysninger for masseindsættelsesoperationer ( BCP.EXE
, SqlBulkCopy
, og jeg antager BULK INSERT
, og OPENROWSET(BULK...
) er muligt, men du vil ikke kunne se de enkelte rækker og kolonner.
Bulk Insert-handlinger vises som en enkelt (vel, én pr. batch, og standarden er at udføre alle rækker i en enkelt batch) DML-sætning af:
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
Du kan finde den fulde liste over "tip" på MSDN-siden for BCP Hjælpeprogram
. Bemærk venligst, at SqlBulkCopy kun understøtter en delmængde af disse tip (f.eks. KEEP_NULLS
, TABLOCK
, og et par andre), men gør ikke understøtte ORDER(...)
eller ROWS_PER_BATCH=
(hvilket faktisk er ret uheldigt, da ORDER()
tip er nødvendigt for at undgå en sortering, der sker i tempdb for at tillade, at operationen logges minimalt (forudsat at de øvrige betingelser for en sådan operation også er opfyldt).
For at se denne erklæring skal du fange en af følgende hændelser i SQL Server Profiler:
Du vil også i det mindste vælge følgende kolonner (i SQL Server Profiler):
Og da en bruger ikke kan indsende en INSERT BULK
erklæring direkte, du kan sikkert filtrere på det i kolonnefiltre, hvis du blot vil se disse begivenheder og intet andet.
Hvis du ønsker at se den officielle meddelelse om, at en BULK INSERT
operationen begynder og/eller slutter, så skal du fange følgende hændelse:
og tilføj derefter følgende Profiler-kolonner:
For ObjectName
du vil altid få hændelser, der viser "BULK INSERT", og om det begynder eller slutter, bestemmes af værdien i EventSubClass
, som enten er "0 - Begynd" eller "1 - Forpligtelse" (og jeg formoder, at hvis det mislykkes, skal du se "2 - Tilbageføring").
Hvis ORDER()
tip blev ikke specificeret (og igen, det kan ikke). angives, når du bruger SqlBulkCopy
), så får du også en "SQLTransaction"-begivenhed, der viser "sort_init" i ObjectName
kolonne. Denne begivenhed har også "0 - Begin" og "1 - Commit" begivenheder (som vist i EventSubClass
kolonne).
Endelig, selvom du ikke kan se de specifikke rækker, kan du stadig se operationer mod transaktionsloggen (f.eks. indsæt række, rediger IAM-række, rediger PFS-række osv.), hvis du fanger følgende hændelse:
og tilføj følgende Profiler-kolonne:
De vigtigste oplysninger af interesse vil være i EventSubClass
kolonne, men det er desværre kun ID-værdier, og jeg kunne ikke finde nogen oversættelse af disse værdier i MSDN-dokumentationen. Jeg fandt dog følgende blogindlæg af Jonathan Kehayias:Brug af udvidede hændelser i SQL Server Denali CTP1 til at kortlægge TransactionLog SQL Trace Event EventSubClass-værdier
.
@RBarryYoung påpegede, at EventSubClass-værdier og -navne kan findes i sys.trace_subclass_values
katalogvisning, men at forespørge på denne visning viser, at den ikke har nogen rækker til TransactionLog
begivenhed:
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 :(
Bemærk venligst, at SqlBulkCopy.BatchSize
egenskab svarer til at indstille -b
mulighed for BCP.EXE , som er en operationel indstilling, der styrer, hvordan hver kommando vil opdele rækkerne i sæt. Dette er ikke det samme som ROWS_PER_BATCH=
hint, som ikke fysisk styrer, hvordan rækkerne er opdelt i sæt, men i stedet tillader SQL Server bedre at planlægge, hvordan den vil allokere sider, og dermed reducerer antallet af poster i Transaction Log (nogle gange med en hel del). Alligevel viste min test at:
- angivelse af
-b
til BCP.EXE indstilledeROWS_PER_BATCH=
hint til den samme værdi. - angivelse af
SqlBulkCopy.BatchSize
ejendom ikke indstilROWS_PER_BATCH=
tip, MEN fordelen ved reduceret transaktionslogaktivitet var på en eller anden måde bestemt der (magi?). Det faktum, at nettoeffekten er stadig at opnå fordelen, er grunden til, at jeg ikke nævnte det øverst, da jeg sagde, at det var uheldigt, atORDER()
tip blev ikke understøttet afSqlBulkCopy
.