sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan fanger jeg de data, der sendes i SqlBulkCopy ved hjælp af Sql Profiler?

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 indstillede ROWS_PER_BATCH= hint til den samme værdi.
  • angivelse af SqlBulkCopy.BatchSize ejendom ikke indstil ROWS_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, at ORDER() tip blev ikke understøttet af SqlBulkCopy .


  1. generere enum klasse fra tabel med JOOQ

  2. Hvordan ser du ALT tekst fra en ntext eller nvarchar(max) i SSMS?

  3. Hvorfor er MySQL langsom, når jeg bruger LIMIT i min forespørgsel?

  4. Opret Java på Oracle-database med JDBC