基于最近实际工作中遇到一个问题:访问某BS平台时报错,初步定位原因为内部数据问题sql返回异常,就需要跟踪一下访问时后台的sql算法。结果按照以前的经验及处理办法(主要是CS程序)没有跟踪到。 故写此篇博文简单介绍SQL Server Profiler工具、BS系统的跟踪办法、数据库优化引擎。
一、简介
SQL Server Profiler的中文意思是SQL Server事件探查,一个Sql的监视工具,可以具体到每一行Sql语句,每一次操作和每一次的连接。其作用如下: 1. 1、图形化监视SQL Server查询; 2. 2、在后台收集查询信息; 3. 3、分析性能; 4. 4、诊断像死锁之类的问题; 5. 5、调试T-SQL语句; 6. 6、模拟重放SQL Server活动;
我们常用到的是使用SQL Profiler捕捉在SQL Server实例上执行的活动,这样的活动被称为Profiler跟踪。
二、Profiler跟踪
我们可以从开始->所有程序->Microsoft SQL Server 2008->性能工具打开Profiler工具,也可以打开SQL Server Management Studio->工具->SQL Server Profiler。 然后选择文件->新建->跟踪打开一个连接窗口,选择将要跟踪的服务器实例然后连接。打开如下“跟踪属性”对话框。

如果有许多跟踪,可以提供一个跟踪名称来帮助在以后进行分类。不同的跟踪模板可帮助建立用于不同目的的跟踪。 打开跟踪属性窗口后,单击“事件选择”选项卡,为跟踪提供更详细的定义。

关于事件、事件列更多信息请自行百度。除了为一个Profiler跟踪定义事件和数据列之外,还可以定义各种过滤条件。这些条件帮助缩小跟踪的输出,这往往是一个好主意。下面给出常用过滤条件列表。

常用的事件列:
| 事件 | 过滤条件实例 | 用处 |
| ApplicationName(应用程序名称) | Not like: SQL Profiler | 创建SQL Servier连接的客户端应用程序的名称(如临床药学管理系统)。默认过滤Profiler生成的事件 |
| DatabaseID(数据库标识符) | Equals:ID of the database to monitor | 过滤特定数据库生成的事件。数据库ID: SELECT DB_IC('PASSPRDB') |
| DatabaseName(数据库名称) | Equals: datebasename of the database to monitor | 正在执行用户语句的数据库名称,**BS程序跟踪的过滤条件主角** |
| ClietntPocessID(进程ID) | Greater than or equal: 2213 | 调用SQL Servier的应用程序的进程ID(可通过任务管理器查看),这是常用跟踪CS程序(如PA2.exe)sql的常用过滤器。 |
| LoginName | medicom | 用户的登陆名(SQL Servier安全登录或者Windows登录的凭据) |
接下来我将重点介绍事件列:DatebaseName。它太重要了。对于BS系统来说,它依赖于浏览器,ClietntPocessID就不那么适用了。那么DatebaseName该它上场了。默认的列筛选器里是没有它的,你需要【显示所有列】,然后找到并勾选上,然后你发现它出来了,像下图一样。

然后你需要输入数据库的名称,如PASSPA2DB,然后点击【运行】。接下你要做的点击访问你要跟踪的BS系统页面,再接下来你要做的就是说OK,完美! 当然适时组合过滤更完美。

三、数据库引擎优化顾问
你以为Profiler就这样,看看文章开头吧。接下来的篇幅将介绍通过跟踪的记录我们怎么样使用数据库引擎优化顾问对其进行分析优化。首先把跟踪到的记录导出到文件.trc类型的文件。如下图(你猜这是跟踪的啥?直说吧:PR的处方查询):

接下来打开数据库引擎优化顾问:单击开始-->程序-->Microsoft SQL Server 2008R2-->性能工具-->数据库引擎优化顾问。然后按如下示例图操作吧。

看一下报告吧,再看一下建议喃:

WTF,缺少索引,缺少统计信息,难怪查询这么慢!建议里给出了哪些表需要优化,应该怎么建立索引和视图才能更有效的提高性能,更牛逼的是连需要优化的Sql语句都给生成好了。来吧,大声的说出来:卧槽!!!
评论
0