加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 08:56:53 所属栏目:MsSql教程 来源:网络整理
导读:我一直在使用Sql Profiler捕获SQL语句并重新运行有问题的语句.很有用. 但是,有些代码使用SqlBulkCopy API,我不知道如何捕获它们.我看到临时表的创建,但没有任何填充它们.看起来像SqlBulkCopy绕过Sql Profiler或者我没有捕获正确的事件. 解决方法 捕获批量插入
我一直在使用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()提示时,我没有提到它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读