sql >> Databáze >  >> RDS >> Sqlserver

Jak zachytím data předaná v SqlBulkCopy pomocí Sql Profiler?

Zachycování informací o události pro operace hromadného vkládání ( BCP.EXE , SqlBulkCopy a předpokládám, že BULK INSERT a OPENROWSET(BULK... ) je možné, ale neuvidíte jednotlivé řádky a sloupce.

Operace hromadného vkládání se zobrazí jako jeden (dobře, jedna na dávku a výchozí nastavení je provést všechny řádky v jedné dávce) DML příkaz:

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

Úplný seznam "nápověd" naleznete na stránce MSDN pro BCP Utility . Upozorňujeme, že SqlBulkCopy podporuje pouze podmnožinu těchto rad (např. KEEP_NULLS , TABLOCK a několik dalších), ale není podpora ORDER(...) nebo ROWS_PER_BATCH= (což je ve skutečnosti docela nešťastné, protože ORDER() nápověda je potřeba, aby se předešlo řazení, ke kterému dochází v tempdb, aby bylo možné operaci minimálně protokolovat (za předpokladu, že byly splněny i ostatní podmínky pro takovou operaci).

Chcete-li zobrazit toto prohlášení, musíte zachytit některou z následujících událostí v SQL Server Profiler:

Budete také chtít vybrat alespoň následující sloupce (v SQL Server Profiler):

A protože uživatel nemůže odeslat BULK INSERT Pokud chcete pouze vidět tyto události a nic jiného, ​​pravděpodobně to můžete filtrovat ve sloupcových filtrech.

Pokud chcete vidět oficiální oznámení, že BULK INSERT operace začíná a/nebo končí, pak musíte zachytit následující událost:

a potom přidejte následující sloupce Profiler:

Pro ObjectName vždy budete dostávat události zobrazující "BULK INSERT" a zda to začíná nebo končí, je určeno hodnotou v EventSubClass , což je buď "0 - Begin" nebo "1 - Commit" (a předpokládám, že pokud selže, měli byste vidět "2 - Rollback").

Pokud ORDER() nápověda nebyla zadána (a opět nemůže být specifikován při použití SqlBulkCopy ), pak také dostanete událost "SQLTransaction" zobrazující "sort_init" v ObjectName sloupec. Tato událost má také události „0 – Begin“ a „1 – Commit“ (jak je uvedeno v EventSubClass sloupec).

A konečně, i když nevidíte konkrétní řádky, stále můžete vidět operace s protokolem transakcí (např. vložit řádek, upravit řádek IAM, upravit řádek PFS atd.), pokud zachytíte následující událost:

a přidejte následující sloupec Profiler:

Hlavní informace, které vás zajímají, budou v EventSubClass ale bohužel se jedná pouze o hodnoty ID a v dokumentaci MSDN jsem nenašel žádný překlad těchto hodnot. Našel jsem však následující blogový příspěvek od Jonathana Kehayiase:Použití rozšířených událostí v SQL Server Denali CTP1 k mapování události trasování TransactionLog SQL EventSubClass Values .

@RBarryYoung poukázal na to, že hodnoty a názvy EventSubClass lze nalézt v sys.trace_subclass_values zobrazení katalogu, ale dotaz na toto zobrazení ukazuje, že nemá žádné řádky pro TransactionLog událost:

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

Vezměte prosím na vědomí, že SqlBulkCopy.BatchSize vlastnost je ekvivalentní nastavení -b možnost pro BCP.EXE , což je provozní nastavení, které řídí, jak každý příkaz rozdělí řádky do sad. Toto není totéž jako ROWS_PER_BATCH= nápověda, která fyzicky neřídí, jak jsou řádky rozděleny do sad, ale místo toho umožňuje SQL Serveru lépe plánovat, jak bude přidělovat stránky, a tím snižuje počet záznamů v protokolu transakcí (někdy až o dost). Moje testování přesto ukázalo, že:

  • zadání -b pro BCP.EXE nastavil ROWS_PER_BATCH= nápověda na stejnou hodnotu.
  • zadání SqlBulkCopy.BatchSize vlastnost ne nastavte ROWS_PER_BATCH= nápověda, ALE, výhoda snížené aktivity Transaction Log tam nějak určitě byla (kouzlo?). Skutečnost, že čistým efektem je stále získat výhodu, je důvod, proč jsem to nezmínil nahoře, když jsem řekl, že je nešťastné, že ORDER() nápověda nebyla podporována SqlBulkCopy .


  1. Vnitřní spojení mezi třemi tabulkami v mysql

  2. Jak převést milisekundy na datum v SQLite

  3. Najít sloupce vrácené funkcí s hodnotou tabulky (příklady T-SQL)

  4. Připravte nový virtuální počítač pro SQL Server 2014 CTP1