冠亚体育手机网站:图文剖析,Profiler的SQL实时监控

上面通过生动的措施体现如下:

      Sql Server Profiler作为Microsoft Sql
Server数据库体系的属性工具,通过它能够对数据库的运转情形进行实时追踪,从中可以找到慢查询只怕死锁的SQL语句,进而去优化系统。本文介绍要是经过Silverlight来对Sql
Server Profiler实行实时监察(数据库情况以Sql Server 二零零五为例卡塔尔

一、SQL Profiler

 

 事件类 Stored Procedures\RPC:Completed TSQL\SQL:BatchCompleted

      首先,先来看下SqlServer数据库自带的性情工具Sql Server
Profiler,新建叁个追踪:冠亚体育手机网站 1

事件非同平常字段
EventSequence、EventClass、SPID、DatabaseName、Error、StartTime、TextData、
HostName、ClientProcessID、ApplicationName、
CPU、Reads、Writes、Duration、RowCounts

咱俩选拔暗中同意的模版Standard,别的都不改变,点击运转:

       1、跟踪慢SQL
冠亚体育手机网站 2 

冠亚体育手机网站 3

     2、追踪SQL施行错误
冠亚体育手机网站 4
冠亚体育手机网站 5

从当中能够看到数据库中的SQL的运维状态,EventClass作为事件类型,TextData作为运维的SQL脚本,ApplicationName作为三个应用程序的施行源的称呼,举个例子说,从.Net应用程序实行的SQL脚本就是.Net
SqlClient Data
Provider,再举例说,小编平素从数据库用户端工具施行一条SQL语句,可以见见ApplicationName为
”Microsoft SQL Server Management Studio –
查询“,由此我们经过ApplicationName字段获得程序的试行源,LoginName作为三个数据库的账户,平日系统客户为sa,包罗CPU/Reads/Writes在这里方面也是洞察,Duration比较有用,能够查阅施行语句的耗费时间,前边还富含StartTime的起始时间和EndTime的收尾时间,当然有些隐讳的列作者就不豆蔻梢头一列举了,有意思味我们可以勾选查看下。

      3、调节和测量检验中找到SQL 以特殊字符作为筛选标准
冠亚体育手机网站 6  

     
如若本人要定义一个符合自个儿索要的沙盘呢,那么能够通过新建/编辑模板来落实:

       4、T-SQL查询trace表

冠亚体育手机网站 7

a、设置抓取的时候段

上面有不少的事件类型的筛选,能够依赖自身的急需定制伊夫nt,这里本人以最简易的方法,就分选了TSQL:SQL
BatchCompleted:

b、保持成文件 然后用下边语句询问文件

冠亚体育手机网站 8

复制代码 代码如下:

再者列选拔四个数据库DatabaseName,相仿于编辑
MyEnt,那样该模板文件只会在MyEnt为名称的数据库中开展SQL施行追踪了:

SELECT EventSequence,SPID,RequestID,DatabaseId,DatabaseName
,LoginName,StartTime,EndTime, TextData,Error ,Duration/1000 AS
Duration,Reads,CPU,Writes,RowCounts
,HostName,ClientProcessID,ApplicationName INTO bak.dbo.traceFROM
::fn_trace_gettable(‘C:\trace\DB50 20150623.trc’, default)

冠亚体育手机网站 9

 二、表存款和储蓄结构

最终点击保存就能够

 1、页 结构

 

冠亚体育手机网站 10

      那么,在.Net上怎么落到实处对于Sql Server
Profiler的应用和监理,实际上,Sql
ServerProfiler本人为.Net开垦的,后来本人在SqlServer二零零七数据库的设置目录
C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies
中,找到一个Microsoft.SqlServer.ConnectionInfo.dll,那些dll就足以兑现实践Sql的督察。

2 区结构

     
伊始创立项目,在那之中,监察和控制程序是二个调控台程序,而Silverlight顾客端程序是二个对此SqlServerProfiler实时监察和控制的呈现,Silverlight的客商端程序通过Socket和监督程序举办通讯。由于Silverlight对于TCP通讯的范围,必得往监理程序发送攻略诉求,並且对于TCP通信来讲,近年来Silverlight的接受端口必需为4502-4530,于是必需在监督端先设置多个Policy.xml的政策文件:

冠亚体育手机网站 11

<?xml version=”1.0″ encoding =”utf-8″?> 
<access-policy> 
  <cross-domain-access> 
    <policy> 
      <allow-from> 
        <domain uri=”*” /> 
      </allow-from> 
      <grant-to> 
        <socket-resource port=”4502-4530″ protocol=”tcp” /> 
      </grant-to> 
    </policy> 
  </cross-domain-access> 
</access-policy>

3 文件存款和储蓄

今日自身将政策供给,监听SL顾客端连接/数据收发需要,数据库监听追踪诉求,分别创制3个线程:

冠亚体育手机网站 12

//创造Socket来监听攻略诉求和发送

4 、基表

this._policyThread = this.CreateThread(this.PolicyRequest); 
//成立Socket来监听音讯央浼和出殡和安葬 
this._infoThread = this.CreateThread(this.InfoRequest); 
//成立Socket来监听数据库追踪央浼和发送 
this._traceServerThread = this.CreateThread(this.TraceServerRequest); 

冠亚体育手机网站 13

PolicyRequest,InfoRequest的措施具体看小说最终的附属类小零器件源代码,这里根本说一下TraceServerRequest的不二秘籍:

5、堆表

SqlConnectionInfo conninfo = new SqlConnectionInfo(); 
conninfo.ServerName = “机器名”; 
conninfo.UserName = “数据库账户”; 
conninfo.Password = “数据库密码”; 
conninfo.UseIntegratedSecurity = false;
TraceServer trace = new TraceServer(); 
trace.InitializeAsReader(conninfo, TDF_FILE); 
SqlConnectionInfo, TraceServer类来自于对Microsoft.SqlServer.ConnectionInfo的援引,在这之中TDF_FILE正是自个儿日前说的追踪模板文件名,它的文书后缀为tdf。
while (trace.Read()) 

    var eventData = new EventData() 
    { 
        EventClass = trace[“EventClass”].ToString(), 
        TextData = trace[“TextData”] != null ? trace[“TextData”].ToString() : “”, 
        ApplicationName = trace[“ApplicationName”] != null ? trace[“ApplicationName”].ToString() : “”, 
        NTUserName = trace[“NTUserName”] != null ? trace[“NTUserName”].ToString() : “”, 
        LoginName = trace[“LoginName”] != null ? trace[“LoginName”].ToString() : “”, 
        CPU = trace[“CPU”] != null ? trace[“CPU”].ToString() : “”, 
        Reads = trace[“Reads”] != null ? trace[“Reads”].ToString() : “”, 
        Writes = trace[“Writes”] != null ? trace[“Writes”].ToString() : “”, 
        Duration = trace[“Duration”] != null ? trace[“Duration”].ToString() : “”, 
        ClientProcessID = trace[“ClientProcessID”] != null ? trace[“ClientProcessID”].ToString() : “”, 
        SPID = trace[“SPID”] != null ? trace[“SPID”].ToString() : “”, 
        StartTime = trace[“StartTime”] != null ? trace[“StartTime”].ToString() : “”, 
        EndTime = trace[“EndTime”] != null ? trace[“EndTime”].ToString() : “”, 
    }; 
    var sendData = JsonConvert.SerializeObject(eventData); 
    if (string.IsNullOrEmpty(sendData)) 
        continue; 
    lock (_lock) 
    { 
        this._queues.Enqueue(sendData); 
    } 

冠亚体育手机网站 14

经过trace.Read()方法来赢得trace的追踪记录,这里本身不会立马通过Socket发送到SL顾客端,而是经过叁个队列对追踪记录进行人队,通过InfoRequest从队列中抽出数据,发送给SL客户端:

6、聚集索引

while (true) 

     lock (_lock) 
     { 
         if (this._queues.Count == 0) 
         { 
             Thread.Sleep(200); 
             continue; 
         } 
         var sendData = this._queues.Dequeue(); 
         Console.WriteLine(sendData);
         byte[] data = Encoding.GetEncoding(“gb2312”).GetBytes(sendData);
         // 移除已断开的套接字 
         this._clientList.RemoveAll(o => o.Connected == false); 
         foreach (Socket s in this._clientList) 
         {            
             if (s.Connected) 
             { 
                 try 
                 { 
                     //发送数据 
                     s.Send(data); 
                 } 

 

 冠亚体育手机网站 15

SL顾客端通过Socket异步编制程序接收数据

7、 普通索引

/// <summary> 
/// 当接过达成 
/// </summary> 
/// <param name=”e”></param> 
void ProcessReceive(SocketAsyncEventArgs e) 

     if (e.SocketError == SocketError.Success) 
     { 
         try 
         { 
             Gb2312Encoding encoding = new Gb2312Encoding(); 
    
             string data = Regex.Replace(encoding.GetString(e.Buffer, 0, e.Buffer.Length), @”\0″, “”); 
    
             EventData eventData = JsonConvert.DeserializeObject<EventData>(data);
             byte[] bytes = new byte[1024]; 
             e.SetBuffer(bytes, 0, bytes.Length);
             this._syn.Send(this.GetText, eventData);
             //履行连接 
             this._socket.ReceiveAsync(this._socketArgs);    
         } 

//同步上下文调用的主意 
private void GetText(object data) 

    if (data == null) 
        return; 
    EventData eventData = (EventData)data; 
    _list.Add(eventData); 
    this.Dispatcher.BeginInvoke(new Action(() => 
    { 
        this.dataGridRecords.ItemsSource = null; 
        this.dataGridRecords.ItemsSource = _list;
        this.dataGridRecords.UpdateLayout(); 
        this.dataGridRecords.SelectedIndex = _list.Count – 1; 
        this.dataGridRecords.ScrollIntoView(this.dataGridRecords.SelectedItem, null); 
    })); 

冠亚体育手机网站 16 

如此就得以实现了Silverlight客户端对于Sql Server Profiler的实时监察。

三、索引优化

三个类型很简短:

1、采取性高唯大器晚成性高的字段放最前头

冠亚体育手机网站 17

2、覆盖索引 Select、Where、Orderby字段都在目录中 恐怕 INCLUDE中
那样就能走到目录

先运行 SqlServerProfier.Host程序:

3、调整索引数量,窄索引
冠亚体育手机网站 18
此图索引成效超级小

冠亚体育手机网站 19

4、改善SQL语句

正值对外发送监察和控制数据,

a、SQL尽量轻巧

接下来运转宿主SL客商端程序的Web端:

 b、参数化SARG的定义 列名 操作符 <常数 或 变量> Name=’张三’ and
价格>5000

冠亚体育手机网站 20

c、非SRAG name like ‘%张’ Name=’张三’ and 价格>5000
NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE
四、推行安插

借使是慢查询的局地,作者会用梅红把它标红,进而鲜明慢查询语句,优化系统

–显示计算音信

 

复制代码 代码如下:

总结:

SET STATISTICS IO ON SET STATISTICS TIME ON SELECT * FROM
dbo.FreezeUserMoney

     
当然,你还足以在督察程序中,对于追踪记录进行Log写入或然一个特定Log表的插入,通过Web端(不管是Silverlight依旧asp.net
mvc均能够查询相关的追踪记录卡塔尔,进而完毕对于数据库SQL试行的监督检查。

翻开实施珍视看上边多少个地点
冠亚体育手机网站 21

 

如上是本着优化sqlserver数据库全部内容,希望我们能够赏识。

附上源代码:SqlServerProfiler.rar

您也许感兴趣的随笔:

  • 开启SQLSEPRADOVELAND数据库缓存注重优化网址质量
  • SQLServer 优化SQL语句 in 和not
    in的代替方案
  • SqlServer
    实行安排及Sql查询优化初探
  • sqlserver关于分页存款和储蓄进程的优化【让数据库按大家的意趣执行查询陈设】
  • SqlServer 索引自动优化工具
  • SQLSE大切诺基VE帕杰罗 SQL质量优化才干
  • 经常搜罗收拾SqlServer数据库优化涉世和注意事项
  • 深切学习SQL
    Server聚合函数算法优化技巧

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注