扩展事件在Denali CTP3里的新UI(二)

在前面一篇博文里我们介绍了如何使用扩展事件(XEvent)在Denali CTP3里的新UI创建和修改XEvent session,本文我们将介绍如何用新UI来显示和分析数据,我们将试图找到一个workload中平均开销最大的query。 在Object Explorer里右键点击前文创建的blogtest session,选择Watch Live Data,如图1所示,这将在SSMS里打开一个新的Live Data窗口,这时我们可以执行我们的workload,workload可以是应用程序的运行,也可以是一段SQL的执行,或者重播Profiler记录的SQL Trace,这里我们在SSMS的另一个窗口执行创建Northwind数据库的instnwnd.sql来模拟一个workload。 图1 启动Live Data窗口 当instnwnd.sql执行完毕后,先前打开的Live Data窗口会出现很多行数据,这些就是blogtest session所记录的sql_statement_starting和sql_statement_completed事件,这时可以点击工具栏上的Stop Data Feed按钮(工具栏第二个按钮),这样可以避免和workload无关的事件继续被Live Data窗口显示,如图2 所示。 图2 Live Data窗口 你的Live Data窗口可能只有2个列,name和timestamp,这是仅有的2个所有扩展事件共有的列,你可以选择工具栏上的Choose Columns…按钮添加/删除需要显示的列,我增加了3个列database_name,duration和statement,如图3所示。 图3 选择列 我们要找到Northwind数据库里平均执行时间最长的query,首先我们可以过滤不必要的事件,前文曾提到过Predicate可以在SQL Server端避免不需要的事件被产生,我们同时也支持客户端的过滤器,这可以帮助你做各种分析。点击工具栏上的Filters…按钮,这将打开Filters对话框,这里我们设置两个条件name=sql_statement_completed And database_name=Northwind,如图4所示。为了避免输入错误,你可以从事件列表里拷贝粘帖,你还可以右键点击某个Cell然后选择Filter by this Value,这将自动为你添加一个子句并And到原有条件上。 图4 Filter对话框 过滤掉不必要的事件后我们按照statement来做分组,点击工具栏上的Grouping…按钮,把statement移动到右边,点击OK,如图5所示。 图5 Grouping对话框 分组的目的是为了计算每个分组上duration的平均值,下面可以点击工具栏上的Aggregation…按钮,我们在duration上选择AVG,然后选择在duration(AVG)上按降序排序,如图6所示。 图6 Aggregation对话框 这样duration平均值最大的分组将被显示在第一行,我执行instnwnd.sql的workload里duration最大的分组是INSERT “Order Details” VALUES(10444,17,31.2,10,0),它的duration是134206微秒,如图7所示。这样我们就找到了平均开销最大的query。 图7 开销最大的query 前文在创建blogtest session时增加了event_file的target,如果你打开SQL Server所在机器的Log目录(比如C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Log),你会发现一堆blogtest*.xel,你可以双击任何一个文件在SSMS里打开和Live…

1

扩展事件在Denali CTP3里的新UI(一)

去年年底时我曾经写过一篇介绍扩展事件(XEvent)在Denali CTP1里新功能的博文,在CTP1中我们提供了一个Object Model和一个简单的UI,在不久前发布的Denali CTP3里我们对XEvent的UI做了更好的支持,本文将进行介绍。 首先我们提供了一个功能强大的对话框用于创建/修改SQL Server里的XEvent Session,你可以在Object Explorer里右键点击Extended Events下的Sessions节点选择New Session…来新建一个Session,如图1所示。这将打开新建Session对话框,这个对话框有4个页面,分别是General、Events、Data Storage (Targets)、Advanced页面,下面我们一一介绍。   图1 新建Session 第一个General页面里你可以输入Session的名字,选择一些选项,比如Session是否和SQL Server一起启动,Session创建成功后是否立即启动该Session等等。我们支持与Profiler里模板类似的概念,只要选择一个模板,Event(包括Action和Predicate)和Target以及某些选项就自动选择好了,但是在CTP3里只有一个Standard模板,这个模板所选择的事件和Profiler里的Standard模板相对应。你也可以把自己创建的Session作为模板保存起来以备后用,保存模板只需要右键点击某个Session然后选择Export Session…即可。这里我们输入blogtest,并选择”Start the event session immediately after session creation”让blogtest在创建成功后立即启动,如图2所示。 图2 General页面 点击左边的Select a page列表里的Events切换到Events页面,这个页面是最复杂的,也是UI能够给你提供最大帮助的地方。你首先看到它分为左右两部分,左边是事件库,所有在SQL Server里注册的扩展事件都列在这里,右边是你选择的事件。在事件的选择上我们做了很多工作来帮助您:1. 你可以点击抬头排序,默认是按事件名排序;2. 可以输入关键字进行过滤,比如图3中我们输入sql_,所有名字含有sql_字样的事件都被列了出来并且高亮显示,过滤可以作用在事件名称上,也可以在事件的名称和描述上,或者事件所含的Fields上,你可以点击事件库右上方的ComboBox切换,所有的过滤都有高亮显示;3. 在Category和Channel上我们实现了和Excel类似的过滤过能,你可以点击Channel右边的下拉箭头选择只看Analytic channel的事件。 找到你需要的事件后,双击它或者点击两部分中间的>按钮加入选择,在这里我们选择了sql_statement_starting和sql_statement_completed事件。你可能注意到了有两个小图标(闪电和漏斗)显示在已选择事件的列表中,下面会介绍。 图3 在Events页面里选择事件 点击Events页面右上方的Configure按钮,页面将会滑动,事件库被隐藏,而配置事件的页面将出现,如图4所示,当然你点击Select可以回到刚才的页面。你会看到闪电和漏斗图标分别出现在了右边配置页面的Actions标签和Filter标签上,闪电代表的是该事件上有多少Global Fields(Actions)关联,漏斗代表该事件有没有Filter(Predicate)关联。 Action是指在发生事件的时刻可以读取的环境数据,比如event_sequence可以为所有事件排序,Profiler里每个事件都含有EventSequence列,而在XEvent里则被作为Action来实现了。 Predicate可以减少不必要的事件收集,比如我可以配置sql_statement_starting事件的Predicate为database_name=’Northwind’,那么发生在其他数据库的sql_statement_starting事件就不会被该Session所收集,Profiler可以为所有事件设置一个Column Filter,而XEvent支持为每个Event设置各自独立不同的Predicate,有兴趣可以参考MSDN里扩展事件对Action和Predicate的介绍。Event Fields标签列出所有该Event的列,某些Event会把一些开销比较大的列作为可选的列,你可以点击前面的CheckBox选择是否收集该列数据,比如sql_statement_starting的statement列就可以被取消选择。 你可以同时选择多个Event并选择/取消Action或配置Filter,在这里我们为sql_statement_starting和sql_statement_completed事件选择database_name action,不添加Filter并保持Event Fields默认值。 图4 在Events页面里配置事件 第三个页面是Data Storage页面,在这个页面里可以选择为Session添加不同的Target,这里我们选择event_file target并保持默认配置。 图5 Data Storage页面…


利用Contained Database和DAC来开发基于SQL Server "Denali"和SQL Azure之上的应用程序

大家好! 在刚刚结束的Microsoft TechEd China 2011中,我们在分会的一个小时里为大家讲解并演示了如何利用Contained Database和DAC来开发基于SQL Server “Denali”和SQL Azure之上的应用程序。为了能够和更多的开发人员和DBA介绍和分享CDB及DAC,并提供相关资源和工具下载的链接,我们特撰文如下,希望有所帮助。 背景 让应用程序的数据层可以在本地SQL Server服务器、私有云、共有云之间方便的部署、移动、升级和管理,正在迅速成为当前云时代的关键技术之一。SQL Server “Denali” 的新增功能——包含的数据库Contained Database (CDB) 和数据层应用DAC正是为了满足这一需求而研发并推出的。这两项技术在一起所提供的功能,将SQL Server应用程序的开发、部署、和不同环境之间的移动完全流程化了,让开发人员和DBA能够淋漓发挥,游刃有余。 进展 亮点简述 包含的数据库Contained Database (CDB):排序规则和安全认证已经可以内置在CDB中; 数据层应用DAC:BACPAC既包含数据库的元信息,也包含数据;原地升级;可以防止篡改; 代码名为“Juneau”的SQL Server开发工具:基于Visual Studio 2010,可以从现有数据库中提取信息新建项目;智能感知(IntelliSense);可深层验证;版本化build;可声明目标平台,定义服务器选择策略;界面友好直观; 导出导入工具:广泛支持SQL Server 2000(仅支持导出)、2005、2008、2008 R2、SQL Server Denali及SQL Azure。 相关资源及下载: 微软MSDN 英文介绍 “包含的数据库” SQL数据库导入导出工具 微软技术白皮书 英文《SQL Server 2008 R2 中的数据层应用程序》 SQL Server开发工具”Juneau” 微软MSDN 中文 SQL Server论坛 最后,为了让更多的开发人员和DBA了解CDB及DAC,我们会在10月24日进行一个同样内容的网络直播,详细信息和注册请参考http://technet.microsoft.com/zh-cn/hh506399 。…

1

扩展事件在Denali CTP1里的新功能

我的同事林默2009年曾写了一篇关于SQL Server 2008里扩展事件(XEvent)介绍的博文,XEvent在SQL 2008里所有的操作必须用TSQL来实现,不是非常方便。在上个月刚刚发布的Denali CTP1里我们对XEvent提供了更多的支持,建立了一个Object Model,在其基础上提供了SQL Server Management Studio(SSMS)里的一个简单UI并同时对PowerShell提供了支持。 有了Object Model后,我们就可以用写.NET代码来创建XEvent Session,修改Session或者枚举数据库里的所有Session。我们可以在Visual Studio里新建一个简单的.NET 3.5 Console Application,并增加对Microsoft.SqlServer.ConnectionInfo,Microsoft.SqlServer.Management.Sdk.Sfc以及Microsoft.SqlServer.XEvent的引用。如果你在Add Reference对话框的.NET标签找不到这些Assembly的话,你可以通过Browse标签到C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies目录下添加这些Assembly。在Program.cs里先增加下面几个using: using System.Data.SqlClient;using Microsoft.SqlServer.Management.XEvent; using Microsoft.SqlServer.Management.Sdk.Sfc; 然后在Main函数里输入下面的代码(你可能需要改变Connection String): using (SqlConnection conn = new SqlConnection(“Data Source=.;Integrated Security=True”)){ conn.Open(); XEStore store = new XEStore(new SqlStoreConnection(conn)); Session session = store.CreateSession(“blogtest”); Event evt = session.AddEvent(“sqlserver.sql_statement_starting”); evt.AddAction(“sqlserver.database_name”); session.AddEvent(“sqlserver.sql_statement_completed”); Target target =…