Улавяне на информация за събитие за операции за групово вмъкване ( BCP.EXE
, SqlBulkCopy
и предполагам BULK INSERT
и OPENROWSET(BULK...
) е възможно, но няма да можете да видите отделните редове и колони.
Операциите за групово вмъкване се показват като единична (добре, една на партида и по подразбиране е да се изпълняват всички редове в една партида) DML израз на:
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
Можете да намерите пълния списък с „подсказки“ на страницата на MSDN за BCP Помощна програма
. Моля, обърнете внимание, че SqlBulkCopy поддържа само подмножество от тези съвети (напр. KEEP_NULLS
, TABLOCK
, и няколко други), но не поддържа ORDER(...)
или ROWS_PER_BATCH=
(което всъщност е доста жалко, тъй като ORDER()
намек е необходим, за да се избегне сортиране, което се случва в tempdb, за да се позволи операцията да бъде минимално регистрирана (ако приемем, че другите условия за такава операция също са изпълнени).
За да видите това изявление, трябва да заснемете някое от следните събития в SQL Server Profiler:
Също така ще искате да изберете поне следните колони (в SQL Server Profiler):
И тъй като потребителят не може да изпрати INSERT BULK
директно, вероятно можете да филтрирате това във Филтри на колони, ако просто искате да видите тези събития и нищо друго.
Ако искате да видите официалното известие, че BULK INSERT
операция започва и/или завършва, тогава трябва да заснемете следното събитие:
и след това добавете следните колони на Profiler:
За ObjectName
винаги ще получавате събития, показващи „BULK INSERT“ и дали то започва или завършва се определя от стойността в EventSubClass
, което е или "0 - Начало" или "1 - Приемане" (и предполагам, че ако не успее, трябва да видите "2 - Връщане назад").
Ако ORDER()
подсказката не е посочена (и отново не може да бъде указано при използване на SqlBulkCopy
), тогава ще получите също събитие „SQLTransaction“, показващо „sort_init“ в ObjectName
колона. Това събитие също така има събития "0 - Начало" и "1 - Приемане" (както е показано в EventSubClass
колона).
И накрая, въпреки че не можете да видите конкретните редове, все още можете да видите операции срещу регистъра на транзакциите (напр. вмъкване на ред, промяна на IAM ред, промяна на PFS ред и т.н.), ако заснемете следното събитие:
и добавете следната колона Profiler:
Основната информация, която представлява интерес, ще бъде в EventSubClass
колона, но за съжаление това са само стойности на ID и не можах да намеря превод на тези стойности в документацията на MSDN. Въпреки това намерих следната публикация в блога на Джонатан Кехайас:Използване на разширени събития в SQL Server Denali CTP1 за картографиране на събитието за проследяване на SQL TransactionLog Стойности на EventSubClass
.
@RBarryYoung посочи, че стойностите и имената на EventSubClass могат да бъдат намерени в sys.trace_subclass_values
каталожен изглед, но заявката за този изглед показва, че няма редове за TransactionLog
събитие:
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 :(
Моля, имайте предвид, че SqlBulkCopy.BatchSize
е еквивалентно на настройката на -b
опция за BCP.EXE , което е оперативна настройка, която контролира как всяка команда ще разделя редовете на набори. Това не е същото като ROWS_PER_BATCH=
намек, който не контролира физически как редовете се разделят на набори, но вместо това позволява на SQL Server да планира по-добре как ще разпредели страниците и следователно намалява броя на записите в регистъра на транзакциите (понякога с доста). Все пак моето тестване показа, че:
- посочване на
-b
за BCP.EXE зададеROWS_PER_BATCH=
намек за същата стойност. - указване на
SqlBulkCopy.BatchSize
свойство не задайтеROWS_PER_BATCH=
подсказка, НО ползата от намалената активност на регистъра на транзакциите беше някак определено налице (магия?). Фактът, че нетният ефект е все още да печелите полза, е защо не го споменах в началото, когато казах, че е жалко, чеORDER()
подсказката не се поддържа отSqlBulkCopy
.