sql-server – 如何使用Sql Profiler捕获在SqlBulkCopy中传递的数据?

前端之家收集整理的这篇文章主要介绍了sql-server – 如何使用Sql Profiler捕获在SqlBulkCopy中传递的数据?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在使用sql Profiler捕获sql语句并重新运行有问题的语句.很有用.

但是,有些代码使用sqlBulkCopy API,我不知道如何捕获它们.我看到临时表的创建,但没有任何填充它们.看起来像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 Utility的“提示”的完整列表.请注意,sqlBulkCopy仅支持这些提示的子集(例如KEEP_NULLS,TABLOCK和其他一些提示),但不支持ORDER(…)或者ROWS_PER_BATCH = **(实际上,这是非常不幸的,因为需要ORDER()提示以避免在tempdb中发生的排序以便允许最小程度地记录操作(假设此类操作的其他条件)也很满意).

要查看此语句,您需要捕获sql Server Profiler中的以下任何事件:

sql:BatchStarting
sql:BatchCompleted
sql:StmtStarting
sql:StmtCompleted

您还需要至少选择以下列(在sql Server Profiler中):

TextData
cpu
Reads
Writes
Duration
SPID
StartTime
EndTime
RowCounts

并且,由于用户无法直接提交INSERT BULK语句,如果您只想查看这些事件而不是其他内容,则可以在列过滤器中对其进行过滤.

如果要查看BULK INSERT操作开始和/或结束的正式通知,则需要捕获以下事件:

sqlTransaction

然后添加以下Profiler列:

EventSubClass
ObjectName

对于ObjectName,您将始终获得显示“BULK INSERT”的事件,以及它是开始还是结束是由EventSubClass中的值确定的,该值是“0 – 开始”或“1 – 提交”(我想如果它失败了,你应该见“2 – 回滚”).

如果未指定ORDER()提示(并且再次使用sqlBulkCopy时无法指定),那么您还将获得在ObjectName列中显示“sort_init”的“sqlTransaction”事件.此事件还具有“0 – 开始”和“1 – 提交”事件(如EventSubClass列中所示).

最后,即使您看不到特定的行,如果捕获以下事件,仍然可以看到针对事务日志的操作(例如,插入行,修改IAM行,修改PFS行等):

TransactionLog

添加以下Profiler列:

ObjectID

感兴趣的主要信息将在EventSubClass列中,但不幸的是它只是ID值,我在MSDN文档中找不到这些值的任何转换.但是,我确实找到了Jonathan Kehayias的以下博文:Using Extended Events in SQL Server Denali CTP1 to Map out the TransactionLog SQL Trace Event EventSubClass Values.

@RBarryYoung指出可以在sys.trace_subclass_values目录视图中找到EventSubClass值和名称,但是查询该视图显示它没有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属性等同于为BCP.EXE设置-b选项,这是一个操作设置,用于控制每个命令如何将行分解为集合.这与ROWS_PER_BATCH =提示不同,ROWS_PER_BATCH =提示不会物理地控制行如何分解成集,而是允许sql Server更好地规划它将如何分配页面,从而减少事务日志中的条目数(有时相当多).我的测试仍显示

>为BCP.EXE指定-b确实将ROWS_PER_BATCH =提示设置为相同的值.>指定sqlBulkCopy.BatchSize属性没有设置ROWS_PER_BATCH =提示,但是,减少的事务日志活动的好处在某种程度上确实存在(魔术?).事实上,净效应仍然可以获益,这就是为什么当我说不幸的是sqlBulkCopy不支持ORDER()提示时,我没有提到它.

猜你在找的MsSQL相关文章