坚持到底!测试到底!

SQL Server 2005性能测试实践 - CPU篇(1)

上一篇 / 下一篇  2007-02-07 16:09:54

摘自CSDN

/AN @[y$~0

jEXZ/pc+J8h0如果在没有额外复杂条件下突然出现CPU瓶颈,有可能是因为没有优化查询,错误的数据库配置,或者是数据库设计上的原因和硬件资源不足引起。在决定采用增加CPU数量或者使用更快速的CPU之前,应该先检查消耗CPU资源最多的操作是否能够被优化51Testing软件测试网a8w6bE v;t,H*G2Hd\;hp

{Hyz(A u s0如果发现性能计数器Processor: % Processor Time的值很高,每一个CPU的% Processor Time都超过80%时,可视为出现CPU瓶颈。也可以通过视图sys.dm_os_schedulers监视SQL Server的进程调度(schedulers)来确认可执行的任务是否为非零值。非零值表示任务被迫等待时间片来运行,如果这个数值非常高,说明存在CPU瓶颈。
GS3n$o!p z~v051Testing软件测试网H tT Gl^"B
Select scheduler_id,current_task_count,runnable_task_count from sys.dm_os_schedulers where scheduler_id<25551Testing软件测试网/x m*}x,T}r*eHi
51Testing软件测试网6qthxlH.@a.`
下面的查询将给出一个较高层的视图来说明当前被缓存的消耗CPU资源最多的批处理或者过程。查询通过相同查询句柄的所有语句合计CPU的消耗情况。
&S3p*j2Ur0
be:rkF N\#o0Ys0Select top 50 sum (qs_total_worker_time) as total_cpu_time,sum(qs.execution_count) as total_execution_count, count(*) as number_of_statements,qs.plan_handle from sys.dm_exec_query_stats qs group by qs.plan_handle order by sum(qs.total_worker_time) desc
hP)H1Ov n)X0
1Y:T]VK:^ `0过多的compilation和recompilation
3S"P&T:T6Ix sR0ry0
/p:IP#fN]K!W0在批处理或者远程过程调用(RPC)提交到服务器执行之前,系统会检查查询计划的有效性和正确性。如果在检查过程中出现了失败的情况,这些批处理可能会被再次编译来产生新的查询计划。这样的编译被称为重编译(recompilations)。这些重编译一般必须确定正确性且通常在服务器认定在潜在数据发生变化后存在可能被优厚的查询计划时执行。编译的特性是CPU敏感的操作,因此过分的重编译可以导致CPU性能问题。51Testing软件测试网2AS Pv$]6u8O

2Tk Pbic0在SQL Server 2000中,当SQL Server重新编译一个存储过程时,整个存储过程都会被重编译,而不只是触发重编译的语句。SQL Server 2005引入了一种语句级别重编的存储过程。当SQL Server 2005重新编译存储过程时,只有引起重编译的语句才会被编译而不是整个过程。这就减少了CPU带宽并且减少了资源锁出现的可能,例如:COMPLIE locks. 重编译可以由于很多不同的原因造成,如:51Testing软件测试网[ y.bi)Yl }Py

l7yV X A$uS0l 架构变化51Testing软件测试网5yA4y6o yB

2J1_:T)`sA2sN0l 统计变化
Aj I P_$UV/`e%R$s051Testing软件测试网J QK_,N~
l 延期编译51Testing软件测试网%uV\ lQ(I
51Testing软件测试网ncK2z}4H
l SET选项变化51Testing软件测试网5g+k#G)NB2D@
51Testing软件测试网&WADP]%o
l 临时表变化51Testing软件测试网4nXfNL6^

"zzc/DU'ZbdJ[j!w0l 存储过程以RECOMPLIE选项建立。51Testing软件测试网+uInm/@E,eb:i

t&pZ1_.b(?,g7h0检测51Testing软件测试网0Vt\1I-h M%K{@

t'gi$I7p6pF2?0使用System Monitor 或者 SQL Server Profiler来检测过多的编译和重编译。51Testing软件测试网mB zOKm

3_~ D2E @5bb'a@T0System Monitor51Testing软件测试网{cS[s5wn
51Testing软件测试网3Q}0w+Z$E w
SQL Statistics对象提供计数器来监视编译和发送到SQL Server实例的请求类型。必须通过监视查询编译和重编译的数量结合接收到的批处理数量来找出高CPU消耗是否是由编译引起。理想情况下,SQL Recompilations/sec和Batch Requests/sec的比率应该应该非常低,除非用户提交的是即席查询。
R{-? M,r)k6z'hNr051Testing软件测试网v2hR\J8LP;g!Y
以下是关键数据计数器:51Testing软件测试网 D} S6@ E
51Testing软件测试网}K \ R&g ] r
l SQL Server: SQL Statistics: Batch Requests/sec51Testing软件测试网HG~y1}

J&C0X:^s`0l SQL Server: SQL Statistics: SQL Compilations/sec
3^,P7i o,OOAWk+Q0
J#sk uG4^6gr?6bp0l SQL Server: SQL Statistics: SQL Recompilations/sec
)vtJ#R:\s051Testing软件测试网-b5M9kepMb(Z!oJ
SQL Trace51Testing软件测试网6] r+^1f}1w5W h;Z4v

l_ | q.ks0如果性能计数器显示非常大的重编译数量,重编译可能正在造成高CPU消耗。接下来需要需要利用SQL Profiler纪录的trace来找出当时被重新编译的存储过程。SQL Server Profiler trace可以给出这些信息连同重编译的原因。可以使用事件来获取这些信息。
A B C4\:B kbA;|6}c/@O)^0
B u.x]VC]P0SP: Recompile / SQL: StmtRecompile. The SP:Recompile and the SQL:StmtRecompile事件类显示哪些存储过程和语句曾经被重新编译过。当编译一个存储过程时,为存储过程和每一个被编译的语句生成事件。然而,当一个存储过程被重新编译时,只有引起重新编译的语句才会被生成一个事件(不同于SQL Server 2000中的整体存储过程编译)。51Testing软件测试网 Bt \*uo

@*]ay4KOF^M9F0SP:Recompile事件类中的重要的数据列如下所示:51Testing软件测试网!D$lb`vX
51Testing软件测试网&f R v;xi$R ?
l Event Class51Testing软件测试网 t4F |&]R\/m7{ H
51Testing软件测试网g7vg+b!["D
l EventSubClass
nZ;kju0wE%@051Testing软件测试网:Yz&F_4Wi
l ObjectID(表示包含这个语句的存储过程)51Testing软件测试网^Z5_3_!aJ5V B3\
51Testing软件测试网%p aL aE|7r}5W
l SPID
$L,U'i qiMk051Testing软件测试网\ Y.`!l h0m`
l Start Time
'z*FCAUM0
4h `6X%c)j'W:B0l SqlHandle
[]~+Lb)Y051Testing软件测试网"Zl2[)[mnA/n
l TextData
!S,ta#Sq-`|0
7p(t j9B%{p0EventSubClass数据列对于确定重编译原因来说非常重要。一旦过程或者触发器被重新编译,SP:Recompile就会被触发,但是有可能被重编译的即席批处理不会引发这个事件。 在SQL Server 2005中,监视SQL:StmtRecompiles时非常有用的,任何类型的批处理,即席查询,存储过程或者触发器被重编译时,这个事件类都会被触发。
$[ zO3G7~:a1zu0
$H8ATd ^fj;xFZ0保存trace文件,使用下面的查询来查看所有的重编译事件。51Testing软件测试网@*sU,CG0m_ |%z

f AD#JK'}2Mf0Select spid,starttime,textdata,eventsubclass,objected,databaseid,sqlhandle from fn_trace_gettable (‘filepath.trc’,1) where EventClass in(37,75,166)51Testing软件测试网@%Q(e1cj"s [p

/db,[M5e:Q}Y0EventClass 37是SP:Recompile, 75是CursorRecompile, 166是SQL:StmtRecompile.
-if _e;l.N051Testing软件测试网^/J%S]-q.KvY S-Q
也可以进一步对这些查询结果根据Sqlhandle和ObjectID列进行分组来查看是否有某个存储过程存在大量的重编译或者由于其他原因导致的重编译(如Set选项变化)。
?~#l9H!b.U,d cj&R+v:U0
a)s!n `0^R^&{0Showplan XML For Query Compile. 这个事件类在Microsoft SQL Server编译或者重新编译SQL语句时发生。这个事件中有关于被编译或者重编译的语句的信息。这些信息包括查询计划和存在问题的过程的Object ID。如果发现SQL Compilations/sec计数器数值很高,应该监视这个事件类。通过这些信息可以发现哪些语句被频繁的重编译。可以使用这些信息改变那些语句的参数。这应该会降低重新编译的次数。
^[u'a3U5gB0
:{[L C/^I Q0DMVs
8p1^ PIN#I051Testing软件测试网?9dp0Z'i DO:S"_&h
当使用sys.dn_exec_query_optimizer_info DMV时,可以得到SQL Server花费在优化上的时间。
!Bp;u8X QZ)k[ {\0
!uOn-V7geY(d EW0Select * from sys.dn_exec_query_optimizer_info51Testing软件测试网l Y2NmQx Lr;Q l;^] i
51Testing软件测试网ep;IDB/W
Counter occurrence value
l6zk dcJN \w#A2~7M051Testing软件测试网&j1[:v-ChG?_
Optimizations XX XX51Testing软件测试网udR\&o!D6~
51Testing软件测试网"YfL%|0E z!Cg
Elaspsed time XX XX51Testing软件测试网 g a#| D[9A

]P2_)_6pw0Elaspsed time是消耗在优化上的时间。这个事件一般接近于消耗在优化上的CPU时间。51Testing软件测试网|4^ B3k2X0u3mA ^-t
51Testing软件测试网8b?f^.vl {
另外一个用来捕获这些信息的DMV是 sys.dm_exec_query_stats
J5G%Wwb$m0
,xS4Gx!@.Jz0下列是需要查询的数据列:
8S8rf1Zpp051Testing软件测试网C/X8n$j-ii J'n
l Sql_handle51Testing软件测试网e Bl$j5lK2J-zo

&ie$`IPD5g1A:l:{T#^0l Total worker time51Testing软件测试网m(B,F'Pj*bZ

/vQ f s!Fz7m&]{0l Plan generation number
lFqH-g051Testing软件测试网 _D-y3EVD/r3?l:E%w5s
l Statement Start Offset51Testing软件测试网e8z vX.rt%A4a(H M|

gfwZ)x0Y.pr0Plan_generation_num表示查询被编译的次数。下列语句给出前25个被编译的存储过程。51Testing软件测试网cZ;pF w6g+Rc z U P*r?
51Testing软件测试网%x)g!zU0k5bKu
Select top 25 sql_text.test,sqlhandle,plan_geration_num,execution_count,dbid,objectid from sys.dm_exec_query_stats across apply sys.dm_exec_sql_text(sql_handle) as sql_text where plan_generation_num>1 order by plan_generation_num desc51Testing软件测试网\*o0~8UkikF I

Nd"pPo^9w3s0解决方法51Testing软件测试网3Z*QQ K*AR7Y`

'x8AJ5sR4o0如果检测到过多的编译/重编译,考虑以下解决方法:
0e8Eg:i'?:g0
sT9` HP ^*A$s0l 如果重编译是因为SET选项引起,使用SQL Profiler确定是哪一个SET发生了变化。尽量避免在存储过程内部修改SET选项。可以选择在连接级别上设置,并确保SET选项在连接的生命周期中不会发生变化。51Testing软件测试网;FS5L"y3f

o%I4X(K:HPc'e@0l 临时表的重编译极值比一般表要低。如果由于统计信息变化导致重新编译临时表时,可以考虑把临时表替换为一个table变量,同样的变化不会影响table变量。这种方法的缺点是查询优化器不能跟踪table变量的信息,因为系统不会为table变量建立和维护统计信息。这可能导致不能优化对于表变量的查询。
3Uirn$D051Testing软件测试网Rx U1a.AKS(z
另外一个选择是使用KEEP PLAN查询提示。它设置临时表的极限值与永久表一致。EventSubClass列将显示临时表上发生了”Statistics Changed” 操作。
&d5Je-L/pC N0
&Teww D7]~:`0l 避免由于统计信息发生变化而导致的重编译(例如,当查询计划因为改变统计信息而不能被达到最优时),指定KEEPFIXED PLAN查询提示。通过这个选项的作用,重编译仅当出现正确性相关的变化时才会发生(例如,当底层表结构发生变化时才会重新编译查询)而不是由于统计数据。如果一个表的架构发生变化,或者表被sp_recompile存储过程标记,重编译将会发生。51Testing软件测试网%_q2xTf'`nt$\j

3c N2T5y c'fi0l 关闭被定义在一个表上的或者被索引的视图上的index & statistics的statistics自动更新防止由于在对象上的statistics的改变引起的重编译。注意,无论如何,关闭”auto-stats” 功能不是很好的选择。这是因为查询优化器不在对数据变化产生作,可能会导致非最优查询计划被执行。
aby w gy&O0
eEn0TT2w ws0l 批处理中应该使用具属对象名(如:dbo.table1)来避免重编译和对象之间的二义性。
#O l{2U3G(lJL4Hz0
$[p~O w]0l 避免由于延迟编译导致的重编译,不要使用条件结构(如IF)来插入DML和DDL或者建立DDL。
@U6eMq5g051Testing软件测试网U$N0AP`6f5bY
l 运行DTA查看是否有可以改善编译时间和查询执行时间。
,z'T+i(PMO+t'LU$I7\ c051Testing软件测试网)y(~0gE-OD t
l 检查是否存储过程使用WITH RECOMPILE选项建立或者查询是否使用了RECOMPILE。如果存储过程使用WITH RECOMPILE选项建立,在SQL Server 2005中,考虑利用语句级别的RECOMPILE如果存储过程中的某个语句需要被重新编译。这可以避免每次执行存储过程时的强制编译,同时允许单独的语句重编译。
'n(qzj T5q5G#_r051Testing软件测试网7p-U _ KH:eI
性能测试应用
3I ZSzGr051Testing软件测试网R6XjqX
从性能测试的角度出发,可以在负载测试过程中收集有关的性能计数器,同时利用SQL Profiler收集负载测试期间有关重编译的事件类。一般情况下负载测试都会产生较高的CPU利用率,特别是压力测试。在测试结束后收集性能计数器确定是否存在过多的编译和重编译情况。
%^Io;M [(y0
+p V7lV5eyM x z0在确定系统出现过多的编译和重编译后,对trace和DMV结果进行分析找出产生大量编译和重编译的存储过程或者语句。根据不同的原因提出相应的解决方案。51Testing软件测试网 hj!P/h6`&oF


TAG: 网络文摘

 

评分:0

我来说两句

Open Toolbar