Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да заснема данните, предадени в SqlBulkCopy с помощта на Sql Profiler?

Улавяне на информация за събитие за операции за групово вмъкване ( 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 .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. как да създадете и извикате скаларна функция в sql сървър 2008

  2. Десетични стойности в SQL за разделяне на резултатите

  3. Пренареждане и дедупликиране на SQL колони въз основа на данни от колони

  4. Изпълняване на SQL Server 2014 на виртуална машина Azure

  5. Помощ за синтаксиса на Sql Server 2008 sp_executesql - мисля, че кавичките ми не са правилни