仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 965|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL教程之使用事务探查器优化SQL Server体系

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:21:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、root帐户设置密码概述
  当你的SQLServer数据库体系运转迟缓的时分,你也许多几少晓得可使用SQLServerProfiler(中文叫SQL事务探查器)工具来举行跟踪和剖析。是的,Profiler能够用来捕捉发送到SQLServer的一切语句和语句的实行功能相干数据(如语句的read/writes页面数量,CPU的利用量,和语句的duration等)以供今后剖析。但本文其实不先容怎样利用Profiler工具,而是将先容怎样利用read80trace(有关该工具见前面先容)工具分离自界说的存储历程来模棱两可地剖析Profiler捕捉的Trace文件,终极得出使人镇静的数据剖析报表,从而使你能够高高在上地优化SQLServer数据库体系。
  本文对那些必要剖析SQLServer年夜型数据库体系功能的读者如DBA等出格有效。在范围较年夜、使用逻辑庞大的数据库体系中Profiler发生的文件常常十分伟大,好比说在Profiler中仅仅设置捕捉基础的语句事务,运转二小时后捕捉的Trace文件便可能有GB级的巨细。使用本文先容的办法不仅能够年夜小节省份析Trace的工夫和款项,把你从Trace文件的海量数据中束缚出来,更是让你对数据库体系的会见形式洞若观火,从而晓得哪一类语句对功能影响最年夜,哪类语句必要优化等等。

Profilertrace文件功能剖析的传统办法和范围
  先说一下甚么是数据库体系的会见形式。除可使用Trace文件办理如逝世锁,堵塞,超时等成绩外,最经常使用也是最次要的功效是能够从Trace文件中失掉以下三个十分主要的信息:
  1.运转最频仍的语句
  2.最影响体系功能的关头语句
  3.各种语句群占用的比例和相干功能统计信息
  本文提到的会见形式就是下面三个信息。我们晓得,数据库体系的模块是基础流动的,每一个模块会见SQLServer的体例也是差未几流动的,详细到某个菜单,某个按钮,都是基础稳定的,以是,在充足长的工夫内,会见SQLServer的各种语句及其占用的比例也基础上是流动的。换句话说,只需Profiler采样的工夫充足长(我一样平常运转2小时以上),那末从Trace文件中就一定能够统计出数据库体系的会见形式。每个数据库体系都有它本人举世无双的会见形式。剖析ProfilerTrace文件的一个主要方针就是找出数据库体系的会见形式。一旦失掉会见形式,你就能够在优化体系的时分做到成竹在胸,心中了然。惋惜直到今朝为止还没有任何工具能够便利地失掉这些信息。
  传统的Trace剖析办法有两种。一种是利用Profiler工具自己。好比说可使用Profiler的Filter功效过滤出那些运转工夫凌驾10秒以上的语句,或依照CPU排序找出最泯灭CPU的语句等。另外一种是把Trace文件导进到数据库中,然后利用T-SQL语句来举行统计剖析。这两种办法对较小的Trace文件是无效的。可是,假如Trace文件数量对照多对照年夜(如4个500MB以上的trace文件),那末这两种办法就有很年夜的范围性。其范围性之一是由于文件伟大的缘故原由,剖析和统计都十分不容易,经常使你没法从全局的高度模棱两可地把握一切语句的实行功能。你很简单被一些语句利诱而把精神泯灭在下面,而实践上它却不是真正必要存眷的关头语句。范围性之二是你发明只管良多语句形式都十分相似(仅仅是实行时参数分歧),却没有一个复杂的办法把他们回类到一同举行统计。简而言之,你没法十拿九稳地失掉数据库体系的会见形式,没法在优化的时分做到高高在上,纲举目张。这就是传统剖析办法的范围性。利用上面先容的Read80trace工具和自界说的存储历程能够克制如许的范围性。

Read80trace工具先容和它的Normalization功效
  Read80Trace工具是一个命令行工具。利用Read80Trace工具能够年夜小节省份析Trace文件的工夫,有事半功倍的效果。Read80Trace的次要事情道理是读取Trace文件,然后对语句举行Normalize(尺度化),导进到数据库,天生功能统计剖析的HTML页面。别的,Read80trace能够天生RML文件,然后OSTRESS工具利用RML文件多线程地重放Trace文件中的一切事务。这关于那些想把Profiler捕捉的语句在别的一台服务器上重放成为大概。本文不具体先容Read80trace或OStress工具,有乐趣的读者请自行参阅相干材料,相干软件能够从微软网站下载(注:软件称号为RML)
  http://www.microsoft.com/downloads/

 我要使用的是Read80Trace的尺度化功效。甚么是尺度化?就是把那些语句形式相似,但参数纷歧样的语句全体回类到一同。举例说Trace中有几条语句以下:

  select*fromauthorswhereau_lname=white
  select*fromauthorswhereau_lname=green
  select*fromauthorswhereau_lname=carson
  经由尺度化后,下面的语句就酿成以下的模样:
  select*fromauthorswhereau_lname={str}
  select*fromauthorswhereau_lname={str}
  select*fromauthorswhereau_lname={str}
  有了尺度化后的语句,统计出数据库体系的会见形式就不再是难事。运转Read80trace的时分我一样平常利用以下的命令行:
  Read80traceCfCdmydbCImytrace.trc
  个中-f开关是不天生RML文件,由于我不必要重放的功效。天生的RML文件对照年夜,倡议读者假如不必要重放的话,也利用-f开关。
  -d开关告知read80trace把trace文件的处置了局存到mydb数据库中。我们前面创立的存储历程恰是会见read80trace在mydb中天生的表来举行统计的。-I开关是指定要剖析的的trace文件名。Read80trace工具很伶俐,假如该目次下有Profiler发生的一系列Trace文件,如mytrace.trc,mytrace1.trc,mytrace2.trc等,那末它会逐一按次读取举行处置。
  除下面先容的外,Read80trace另有良多别的风趣的开关。好比说利用-i开关使得Read80trace能够从zip或CAB文件中读取trace文件,不必本人解压。一切开关在Read80trace.chm中有具体先容。我最浏览的中央是read80trace的功能。剖析几个GB巨细的trace文件不敷一小时就弄定了。我的盘算机是一台内存仅为512MB的老呆板,有如许的功能我很中意。
  你大概会利用read80trace剖析压力测试发生的trace文件。我倡议仍是剖析从临盆情况中捕捉的Trace文件为好。由于良多压力测试工具都不克不及够真正摹拟实际的情况,其失掉的trace文件也就不克不及实在反应实践的情形。乃至有些压力测试工具是轮回实行本人写的语句,更不克不及反应正确的会见形式。倡议仅仅把压力测试发生的trace作为参考利用。

利用存储历程剖析Normalize后的数据
  有了尺度化后的语句就能够利用存储历程举行统计剖析了。剖析的基础头脑是把一切形式一样的语句的Reads,CPU和Duration做groupby统计,得出会见形式信息:
  1.某类语句的统共实行次数,均匀读页面数(reads)/均匀CPU工夫/均匀实行工夫等。
  2.该类语句在一切语句的比例,如实行次数比例,reads比例,CPU比例等。
  存储历程的界说和申明以下:

Createprocedureusp_GetAccessPattern8000
@duration_filterint=-1--传进的参数,能够依照语句实行的工夫过滤统计
asbegin
/*起首失掉全体语句的功能数据的总和*/
declare@sum_totalfloat,@sum_cpufloat,@sum_readsfloat,@sum_durationfloat,@sum_writesfloat
select@sum_total=count(*)*0.01,--这是一切语句的总数。
@sum_cpu=sum(cpu)*0.01,--这是一切语句泯灭的CPU工夫
@sum_reads=sum(reads)*0.01,--这是一切语句泯灭的Reads数量,8K为单元。
@sum_writes=sum(writes)*0.01,--这是一切语句泯灭的Writes数量,8K为单元。
@sum_duration=sum(duration)*0.01--这是一切语句的实行工夫总和。
fromtblBatches--这是Read80Trace发生的表,包含了Trace文件中一切的语句。
whereduration>=@duration_filter--是不是依照实行工夫过滤
/*然落后行Groupby,失掉某类语句占用的比例*/
Selectltrim(str(count(*)))exec_stats,+str(count(*)/@sum_total,4,1)+%ExecRatio,
ltrim(str(sum(cpu)))+:++ltrim(str(avg(cpu)))cpu_stats,+str(sum(cpu)/@sum_cpu,4,1)+%CpuRatio,
ltrim(str(sum(reads)))+:+ltrim(str(avg(reads)))reads_stats,+str(sum(reads)/@sum_reads,4,1)+%ReadsRatio,
--ltrim(str(sum(writes)))+:+ltrim(str(avg(writes)))--writes_stats,+str(sum(writes)/@sum_writes,4,1)+%),
ltrim(str(sum(duration)))+:+ltrim(str(avg(duration)))duration_stats,+str(sum(duration)/@sum_duration,4,1)+%DurRatio,
textdata,count(*)/@sum_totaltp,sum(cpu)/@sum_cpucp,sum(reads)/@sum_readsrp,sum(duration)/@sum_durationdp
into#queries_staticsticsfrom
/*tblUniqueBatches表中寄存了一切尺度化的语句。*/
(selectreads,cpu,duration,writes,convert(varchar(2000),NormText)textdatafromtblBatches
innerjointblUniqueBatchesontblBatches.HashId=tblUniqueBatches.hashidwhereduration>@duration_filter
)Bgroupbytextdata--这个groupby很主要,它对语句举行回类统计。
printTop10orderbycpu+reads+duration
selecttop10*from#queries_staticsticsorderbycp+rp+dpdesc
printTop10orderbycpu
selecttop10*from#queries_staticsticsorderbycpdesc
printTop10orderbyreads
selecttop10*from#queries_staticsticsorderbyrpdesc
printTop10orderbyduration
selecttop10*from#queries_staticsticsorderbydpdesc
printTop10orderbybatches
selecttop10*from#queries_staticsticsorderbytpdesc
End
思索到输入了局横向较长,存储过程当中把writes往失落了。这是由于年夜部分的数据库体系都是Reads为主的。你能够容易的修正存储历程把write也包含出来。
  存储历程其实不庞大,很简单了解。能够看到统计的了局放在queries_staticstics表中,然后依照分歧的前提排序后输入。举例说:
  selecttop10*from#queries_staticsticsorderbycpdesc
  下面的语句将把queries_staticstics表中的纪录依照某类语句占用总CPU量的比例cp(即sum(cpu)/@sum_cpu)举行排序输入。这让你在剖析服务器CPU功能成绩的时分疾速定位哪一类语句最耗CPU资本,从而有的放矢。
  如今让我们看一个实例的输入:
  Usemydb
  Execusp_GetAccessPattern
  /*你能够输出一个实行工夫作为过滤参数,毫秒为单元。如usp_GetAccessPattern1000*/
  输入了局如所示(是部分了局,别的,由于原输入了局横向很长,为便利浏览,把了局从中截断为两部分):



:输入了局采样一

  下面的例子采样于一家年夜型公司的营业体系。该体系的成绩是使用程序运转迟缓,SQLServer服务器的CPU高居不下(8个CPU都在90%~100%间动摇)。我利用PSSDIAG工具采样2小时摆布的数据,然后运转read80trace和usp_GetAccessPattern得出下面的了局。报表一览无余。存储历程DBO.x_DEDUP_PROC在两小时内共运转75次,却占用了90.8%的CPU资本,94.6%的Reads,从会见形式的角度,该存储历程恰是招致CPU高和体系功能慢的关头语句。一旦优化了该存储历程,体系的功能成绩将水到渠成。你大概有疑问,两小时内共运转75次,不是很频仍啊。实在你看看这条存储历程的均匀CPU工夫是681961毫秒,也许11分钟摆布。也就是说一个CPU两小时内最多能够实行(60*2)/11=10条摆布,该体系统共有8个CPU,即便全体CPU都用来运转该语句,那末最多也就是10*8=80条摆布。下面实行总数是75,申明该存储历程一向在接二连三地运转。
  那末该体系运转最频仍的语句是甚么呢?我从了局中摘取别的一部分以下():




:输入了局采样二

  从上表能够看出,最频仍运转的语句是

  USExbSETQUOTED_IDENTIFIER,ANSI_NULL_DFLT_ON…
  明显这是一条实行情况设置语句,没有参考代价。却是别的两条占用语句总数8.2%的语句值得存眷:
  SELECTCOUNT(*)FROMx_PROCESS_STATSWHEREPROCESS……
  SELECTCOUNT(*)FROMx_PROCESS_STATSWHEREPROCESS……
  在这个例子中,由于关头语句DBO.x_DEDUP_PROC十分凸起,乃至下面的两条语句都能够疏忽了。
  让我们再多看一个例子():



:输入了局采样三

  从下面的例子中,能够得出关头的语句是:

  SELECTCOUNT(*)FROMGTBL7MS
  SELECTCaseNOFROMPATIENTDATA_sumWHEREMRN=@P1

 后续的反省发明相干的表没有无效的索引,加上索引后功能当即全体地进步了很多.。办理了这两个语句,必要利用一样的手腕持续剖析和优化,直到体系的功能可以承受为止.。注重功能调优是一个临时的历程,你不太大概一两天就能够把一切的成绩都办理。大概一入手下手能够办理80%的成绩,可是前面20%的成绩却必要别的80%的工夫。

利用usp_GetAccessPattern的一些技能
  usp_GetAccessPattern的输入报表包括了十分丰厚的信息。剖析报表的时分必要有年夜局不雅。你也能够有目标性地选择你必要的信息。假如是CPU功能瓶颈的体系,那末你必要存眷CPU占用比例高的那类语句。假如是磁盘IO呈现功能瓶颈那末你必要找到那些Reads占用比例年夜并且均匀reads也很高的语句。必要注重的是偶然候运转频仍的语句一定就是你必要存眷的关头语句。一个最幻想的情形是关头语句恰好就是最频仍的语句。偶然候即便最频仍语句占用的资本比例不高,但假如还能够优化,那末由于缩小效应,巨大的优化也会给体系带来可不雅的优点。
  在利用usp_GetAccessPattern的时分多分离@duration_filter参数利用。由于参数以毫秒为单元,倡议参数不要小于1000,而应当是1000的倍数如3000,5000等。该参数经常会给出十分成心思的输入。该输入和不带参数运转的了局会有某些堆叠。堆叠呈现的语句一般恰是必要存眷的语句。要注重运转最多最密的语句一定有凌驾1000毫秒的实行工夫,一切带参数运转的了局有大概不包含最频仍语句。我经常同时交织剖析四个了局,一个是不带参数运转失掉的,另三个分离是利用1000,3000和5000毫秒为参数运转的了局。对照剖析这四个了局常常使我对数据库体系的会见形式有十分明晰透辟的了解。
  运转存储历程时你大概会碰着int整数溢出的毛病。这是由于表tblBatches中的reads,cpu和writes字段是int而不是bigint。能够运转以下语句举行修改:

  altertabletblBatchesaltercolumnreadsbigint
  altertabletblBatchesaltercolumncpubigint
  altertabletblBatchesaltercolumnwritesbigint
  修改后溢出成绩就会办理。

蛇足:哪一个是HOT数据库?
  本文到这里就基础上停止了。你已晓得怎样利用Read80Trace和usp_GetAccessPattern失掉数据库体系的会见形式,和怎样从全局的高度往剖析会见形式报表,从而在优化体系的时分做到模棱两可,成竹在胸。
  除此以外,你还能够使用相似的剖析头脑失掉每一个数据库的占用资本比例。这关于SQLServer有多个数据库的情形十分有效。从报表中你能够当即晓得哪一个数据库是最HOT最损耗体系资本的数据库。语句以下:

printgroupbydbid
declare@sum_totalfloat,@sum_cpufloat,@sum_readsfloat,@sum_durationfloat,@sum_writesfloat
select@sum_total=count(*)*0.01,@sum_cpu=sum(cpu)*0.01,@sum_reads=sum(reads)*0.01,@sum_writes=sum(writes)*0.01,
@sum_duration=sum(duration)*0.01fromtblBatches
selectdbid,
ltrim(str(count(*)))exec_stats,+str(count(*)/@sum_total,4,1)+%ExecRatio,
ltrim(str(sum(cpu)))+:++ltrim(str(avg(cpu)))cpu_stats,+str(sum(cpu)/@sum_cpu,4,1)+%CpuRatio,
ltrim(str(sum(reads)))+:+ltrim(str(avg(reads)))reads_stats,+str(sum(reads)/@sum_reads,4,1)+%ReadsRatio,
ltrim(str(sum(duration)))+:+ltrim(str(avg(duration)))duration_stats,+str(sum(duration)/@sum_duration,4,1)+%DurRatio,
count(*)/@sum_totaltp,sum(cpu)/@sum_cpucp,sum(reads)/@sum_readsrp,sum(duration)/@sum_durationdp
into#queries_staticstics_groupbydbfrom
(selectreads,cpu,duration,writes,convert(varchar(2000),NormText)textdata,dbidfromtblBatches
innerjointblUniqueBatchesontblBatches.HashId=tblUniqueBatches.hashid
)bgroupbydbidorderbysum(reads)desc
selectdbid,ExecRatiobatches,CPURatioCPU,ReadsRatioReads,DurRatioDuration
from#queries_staticstics_groupbydb
  上面是一个下面语句了局的一个例子:
  dbid batches CPU Reads Duration
  ------ ------- ----- ------- --------
  37  21.1% 18.7% 29.1% 27.1%
  33  12.7% 32.4% 19.5% 24.8%
  36  5.6% 28.3% 15.6% 26.1%
  20  53.9% 2.9% 14.2% 2.1%
  22  0.8%  7.2% 13.2% 6.6%
  25  1.0%  3.6% 5.4% 3.5%
  16  0.0%  1.5% 1.9% 0.7%
  35  2.0%  2.7% 1.8% 5.7%
  70.  1%  0.1% 1.1%  0.3%
  下面的了局明白地告知我们ID为37,33和36的数据库是最活泼的数据库。一个风趣的现实是数据库20收回的语句总数比例是53.9%,可是其占用的体系资本比例却不高。
mysql的原来开发者又开发了MariaDB,MariaDB适合用来替代mysql吗
精灵巫婆 该用户已被删除
沙发
发表于 2015-1-19 09:24:10 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
活着的死人 该用户已被删除
板凳
发表于 2015-1-26 19:35:47 | 只看该作者
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
谁可相欹 该用户已被删除
地板
发表于 2015-2-4 20:37:36 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
乐观 该用户已被删除
5#
发表于 2015-2-10 08:20:19 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
小魔女 该用户已被删除
6#
发表于 2015-3-1 04:36:50 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
飘飘悠悠 该用户已被删除
7#
发表于 2015-3-10 12:51:43 | 只看该作者
现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.
透明 该用户已被删除
8#
发表于 2015-3-17 07:43:49 | 只看该作者
大侠们有推荐的书籍和学习方法写下吧。
海妖 该用户已被删除
9#
发表于 2015-3-24 02:50:08 | 只看该作者
比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 19:32

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表