使用Extended Events诊断SQL Server 2012----在SQL Server 2012中创建Extended Event会话

New Session Form介绍

SSMS提供两种途径来创建一个新的会话:New Session Wizard和New Sessiion创建表单,如图13-5所示。虽然新人倾向于使用向导来创建,但使用New Session(如图13-6所示)并不是太复杂。刚开始创建session时,推荐忽略向导。

除了给Session命名外,如Deadlock_Detection,它有如下3个选项(如图13-6中的方框标记):Template、Schedule和Causality(因果关系) Tracking.

Events窗格,如图13-7所示,用于配置收集数据的事件。

一旦events添加后,如图13-8所示,你就能点击Configure按钮。这样就显示如图13-9所示的可供选择的额外session选项。Actions又称为全局栏位,可供选择;filters又称为predicates,可被定义;之后你可以选择额外的栏位,即采集时可用的事件。

窗格的Data Storage页面,如图13-10所示的可用目标的下拉列表是用来定义session的目标。一个session可以有多个targets,例如一个事件文件和一个事件计数器,在这里可以配置它们。如你后面所示,直方图目标有其自带的额外配置选项,当你把它们任何一个添加进去后就变成可用的了。

最后,你可以通过Advanced框格,配置一些高级的session选项,如Event Retention Mode和Max Memory Size,如图13-11所示。

监视服务器登录

看过session配置界面后,现在使用它来部署一个session,来捕获登录信息。这个session的重要选项如图13-12的方框标记的地方。如图中所示,我们从栏位client_app_name和client_hostname配置login事件来抓取数据,没有显示但有选择nt_username全局栏位。

一旦session创建好,如果你没有设置自动启动,那么你需要手动启动它。要做到这点,右击session,并选择Start Session。确认session在运行后,就会开始把登录信息捕获到你设置的目标。抓获的数据,如图13-13所示的在SSMS中显示的一个例子:

利用Extended Events监视分页(Page Split)

这个例子强制一个聚集索引执行几次分页,向你演示如何使用Extended  Events来监视发生的分页及哪个SQL Server语句引起的。图13-14显示了相关的session配置,配置session其余的选项及其事件文件目标不那么重要。栏位database_name添加了,但未显示。如果你没有添加这个,你仅仅获得database_id,对于你解决问题来说,信息仍足够。

创建并开启该session后,就要强制做一些分页,以供抓获。下面的脚本将会在insert语句引起分页之前创建一个简单的数据库和表。

create database PSDemo
go
use PSDemo
go
create table t1 (ID uniqueidentifier default newid(),
val1 char(8000), val2 char(37))
go
create clustered index idx_t1 on t1(ID)
go

insert t1 (val1, val2) values ('X','Y')
go
-- Repeat this insert statement as often as you want to cause splits
insert t1 (val1, val2) (select val1, val2 from t1)
go

执行该脚本后,你就能够看到创建一个数据库时分页有多频繁,特别是表设计时。图13-15显示了所捕获的分页的一个例子:


 计算每个对象取得锁的个数

 最后一个例子是使用直方图目标来合计查询执行时用户数据库中对象获得的锁的个数。你或许想这样做来发现数据库中锁的热点地方,但是这里使用它是因为要展示直方图目标和事件过滤器如何工作。事件lock_acquired提供所有所需信息,所以你不需要使用任何global action或额外的事件栏位。相反,因为SQL Server自身有很多来自系统进程的后台锁定活动发生,使用filter来排除你不感兴趣的锁定活动。配置如图13-16所示。

如果你想知道过滤器值来自哪里,答案就是综合已知的需求及反复试验。部署Extended Events会话的好处之一是,容易停止、重新配置及重新启动会话。栏位database_id是执行查询select db_id('PSDemo')获取的。添加直方图目标(histogram target 如图13-17)需要配置一些属性,但是你可以使用下拉框里的值。

随着session在运行,你可以执行前面实例中的insert语句来引起锁:insert t1 (val1, val2) (select val1, val2 from t1)。这会产生如图13-18所示的直方图。图中245575913实际就是表t1的对象ID,而261575970则是表t1的ID栏位的默认约束。

使用T-SQL创建对话

 Extended Events有一整套T-SQL命令,这些命令在这里没有深入地覆盖。不幸的是,它们的复杂度已经成为人们还没有开始使用它们的重要原因之一,这就是为何聚焦于使用SSMS界面的原因。然而,如果你想使用T-SQL Extended Events命令,SSMS界面可以帮你入门,定义之后可以导出session的脚本。你可以使用Script按钮来做到这点,你或许熟悉SSMS其他部分,但是,如图13-19显示。

例如,抓获所有登出事件的session的T-SQL创建脚本如下显示:

CREATE EVENT SESSION [LogoutEvents] ON SERVER
ADD EVENT sqlserver.logout(ACTION(sqlserver.client_app_name,
sqlserver.client_hostname,sqlserver.nt_username))
ADD TARGET package0.event_file(SET filename=N'C:\XELogs\LogoutEvents.xel')
WITH (STARTUP_STATE=ON)
GO

对于大多数阅读本书的人而言,很容易追踪T-SQL脚本,你闲杂可能很容易地写出自己的脚本,来创建其他session。然而,SSMS的优势是可以协助你学习如何写出更复杂的脚本,而不会犯基本的错误。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Excel数据插入SqlServer并避免重复数据,可以使用以下步骤: 1. 将Excel数据读取到DataTable。 2. 在DataTable检查是否存在重复数据,如果存在则删除重复数据。 3. 使用SqlBulkCopy将数据插入到SqlServer。 以下是示例代码: ```csharp using System.Data; using System.Data.OleDb; using System.Data.SqlClient; //连接Excel文件 string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\sample.xlsx;Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; OleDbConnection excelConn = new OleDbConnection(connString); excelConn.Open(); //读取Excel数据到DataTable string sql = "SELECT * FROM [Sheet1$]"; OleDbDataAdapter adapter = new OleDbDataAdapter(sql, excelConn); DataTable excelData = new DataTable(); adapter.Fill(excelData); excelConn.Close(); //检查是否存在重复数据 for (int i = excelData.Rows.Count - 1; i >= 0; i--) { DataRow row = excelData.Rows[i]; if (IsDuplicate(row)) { excelData.Rows.Remove(row); } } //将数据插入到SqlServer string sqlServerConnString = "Data Source=.;Initial Catalog=TestDB;Integrated Security=True;"; SqlConnection sqlServerConn = new SqlConnection(sqlServerConnString); sqlServerConn.Open(); SqlTransaction tran = sqlServerConn.BeginTransaction(); try { using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlServerConn, SqlBulkCopyOptions.Default, tran)) { bulkCopy.DestinationTableName = "Person"; bulkCopy.ColumnMappings.Add("Name", "Name"); bulkCopy.ColumnMappings.Add("Age", "Age"); bulkCopy.WriteToServer(excelData); } tran.Commit(); } catch (Exception ex) { tran.Rollback(); throw ex; } finally { sqlServerConn.Close(); } //检查是否存在重复数据的方法 private bool IsDuplicate(DataRow row) { string name = row["Name"].ToString(); int age = int.Parse(row["Age"].ToString()); string sql = "SELECT COUNT(*) FROM Person WHERE Name=@Name AND Age=@Age"; using (SqlConnection conn = new SqlConnection(sqlServerConnString)) { SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@Name", name); cmd.Parameters.AddWithValue("@Age", age); conn.Open(); int count = (int)cmd.ExecuteScalar(); if (count > 0) { return true; } else { return false; } } } ``` 以上代码使用了IsDuplicate方法来检查是否存在重复数据,该方法查询了目标表是否存在相同的Name和Age值。如果存在则返回true,否则返回false。在使用SqlBulkCopy插入数据时,应该先将Excel数据读取到DataTable,然后在DataTable检查是否存在重复数据,最后再将数据插入到SqlServer

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值