sybase监控执行sql(转自新浪)

  

众所周知,系统调优很重要的一个方面是应用的调优. 而基于数据库的应用中,最重要的工作之一就是进行SQL语句的调优. SYBASEASE以前的版本中,很难实现语句监控,从而进一步分析,优化相关的语句,也就很难对已经投入生产的应用进行进一步调优.ASE12.5.0.3开始,增加了很多的系统监控表,称为MDA table,实际上是一些proxy table.通过这些表可以完整地进行了系统监控,包括数据缓存监控,存储过程缓存监控,索引使用监控等,其中非常重要的一个部分是SQL语句的监控,它弥补了以前ASE性能调优重要的一个方面.详细内容大家可以参照sybase的官方文档:http://manuals.sybase.com/onlinebooks/group-as/asg1251c/monitoringzh(ASE12.5.1性能调优之监控下载链接).而对于最新的版本ASE15,SYBASE则提供了更为方便的工具.本方档就ASE三种版本就SQL语句监控方法做一个总结.

一: ASE12.5.0.3之前语句监控

ASE12.5.0.3之前没有MDA监控表,只能通过dbcc命令逐个查看当前用户正在执行的语句,这种方法也适用于其它版本:

1> dbcc traceon(3604)

2> go

DBCC execution completed. If DBCC printederror messages, contacta user with

System Administrator (SA) role.

1> dbcc sqltext(1029)

2> go

SQL Text: select

btypeid,cname,atypeid,bureauid,deptid,llevel,baseval,range,remarkfrom

e_jh_log_btype where (deptid = '1100121'and llevel = 2) or(deptid = '0' and

bureauid = '1100' and llevel = 1) or(bureauid = '0' and llevel =0)

DBCC execution completed. If DBCC printederror messages, contacta user with

System Administrator (SA) role.

其中1029是用户连接的sid.这种监控的方法能找到某个用户正在执行的语句.但这种方法对于希望找出系统中最消耗资源的SQL语句,怕是无能为力.对于由于不良的SQL语句导致的系统性能低下,DBA简直无能无力.

二: ASE12.5.0.3及以后版本的监控

ASE12.5.0.3开始,提供了一整套用于系统监控的proxytable.默认安装下,这些新的监控表数据库中是没有的,需要执行以下步骤安装,这里假设用户的server名为SYBASE:

1. 增加loopback服务

1>use master

2>go

1>sp_addserver loopback, null, @@servername

2>go

可以使用下面的语句来测试这个服务是否配置正确

1>set cis_rpc_handling on
2>go
这个如果返回是0,或者是执行正确,就表示刚才的配置正确了.

当然,也可以通过下面的方法来测试

1>exec loopback..sp_who

2>go

2. 在CMD下,执行脚本installmontables,安装MDA表,这些表会安装在master数据库中.

isql -Usa -P123456 -Setoh-i$SYBASE/$SYBASE_ASE/scripts/installmontables

3、给sa授权mon_role(监控用户)权限

1>use master

2>go

1>grant role mon_role to sa

2>go

用下面的语句来测试授权是否成功

1>select * from master..monState
go

4, 配置相关参数

用sa登录,配置以下参数:

1>sp_configure 'enable cis', 1

2>go

1>sp_configure 'sql text pipe active',1

2>go

1>sp_configure 'sql text pipemaxmessages',30000

2>go

1>sp_configure "plan text pipeactive", 1

2>go

1>sp_configure "plan text pipe maxmessages",30000

2>go

1>sp_configure 'statement pipe active',1

2>go

1>sp_configure 'statement pipemaxmessages',30000

2>go

1>sp_configure "errorlog pipeactive", 1

2>go

1>sp_configure"errorlog pipe max messages",30000

2>go

1>sp_configure "deadlock pipeactive", 1

2>go

1>sp_configure"deadlock pipe max messages",30000

2>go

1>sp_configure "wait eventtiming", 1

2>go

1>sp_configure "process waitevents", 1

2>go

1>sp_configure "object lockwaittiming", 1

2>go

1>sp_configure 'SQL batch capture',1

2>go

1>sp_configure 'statement statisticsactive',1

2>go

1>sp_configure 'per objectstatisticsactive',1

2>go

1>sp_configure 'max SQL textmonitored',15000

2>go

1>sp_configure 'enable monitoring',1

2>go

1>shutdown

2>go

上述参数中'max SQLtextmonitored'是静态的,配置完后,需要重新启动后才能生效。这些参数的具体含义大家看一下通过上面的链接下载的手册就知道了.其中sp_configure'enablemonitoring',1是启用监控,启用监控对系统的性能会有一定的影响,所以在不需要监控的时候,把它置为0,关闭监控:

sp_configure 'enable monitoring',0

go

sp_configure 'SQL batch capture',0

go

sp_configure 'statement statistics active',0

go

sp_configure 'per object statisticsactive',0

go

sp_configure "object lockwaittiming",0

go

sp_configure "process waitevents",0

go

sp_configure "wait event timing",0

go

sp_configure "deadlock pipeactive",0

go

sp_configure "errorlog pipeactive",0

go

sp_configure 'statement pipe active',0

go

sp_configure "plan text pipeactive",0

go

sp_configure 'sql text pipe active',0

go

5. 重新启动后,就可以监控了.

监控语句用会用到四个监控表,monProcessStatement, monProcessSQLText,monSysStatement, monSysSQLText:

monProcessStatement: 提供当前正在执行的语句的信息.

monProcessSQLText: 提供当前正在执行的 SQL 文本.

monSysStatement: 提供有关最近执行的语句的统计信息. 每次查询后都会被清空.

monSysSQLText: 提供已经执行的最新 SQL 文本或当前正在执行的 SQL 文本。每次查询后都会被清空.

监控SQL示例:

a.查看当前正在执行的sql语句的情况,显示逻辑读的多的在前面.可以看到具体的语句及CPUtime,WaitTime,MemUsageKB,PhysicalReads,LogicalReads,PagesModified等信息,含义请查看上述手册:

select DBID, S.SPID, T.SequenceInLine,CpuTime, WaitTime,MemUsageKB, PhysicalReads, LogicalReads, PagesModified,

SQLText from master..monProcessStatementS,master..monProcessSQLText T where S.SPID = T.SPID order byLogicalReads desc

用户可以根据需要选择其它的列进行排序,找出当前正在运行的消耗资源的SQL语句.

b. 查看最近一段时间内的SQL语句执行情况.

为方便语句监控,我建立了四个存储过程, 这里假设用户库名中TEST:

use TEST

go

create procedure sp_monCreate

as

if exists (select 1 from sysobjectswherename='temp_monSysStatement')

exec ('drop table temp_monSysStatement')

if exists (select 1 from sysobjectswherename='temp_monSysSQLText')

exec ('drop table temp_monSysSQLText')

select * into temp_monSysStatement frommaster..monSysStatementwhere 1=2

select * into temp_monSysSQLText frommaster..monSysSQLText where1=2

go

exec sp_monCreate

go

create procedure sp_monPurge

as

truncate table temp_monSysStatement

truncate table temp_monSysSQLText

go

create procedure sp_monCollect

as

insert temp_monSysStatement select *frommaster..monSysStatement

insert temp_monSysSQLText select * frommaster..monSysSQLText

go

create procedure sp_mon

as

selectDBID,S.SPID,T.SequenceInBatch,CpuTime,WaitTime,MemUsageKB,PhysicalReads,LogicalReads,PagesModified,

SQLText fromTEST..temp_monSysStatementS,TEST..temp_monSysSQLText T whereS.SPID=T.SPID and S.BatchID=T.BatchID orderby LogicalReads desc

go

监控过程如下:

(1). 执行sp_monPurge,清除上次监控时留下的数据

(2). 启用监控 sp_configure 'enable monitoring',1

(3). 每隔一小段时间(这个时间内系统运行的SQL语句不超过前面设置的'statement pipe maxmessages'值,否则会有语句被清掉,不能监控到.)

(4). 停止监控 sp_configure 'enable monitoring',0

(5).在系统相对空闲时,生成监控的结果.监控时间长时,两个表中的数据量会很大,生成结果会消耗很多资源,建议在不影响生产的情况下生成.同时,监控的SQL语句很多时,建议先在temp_monSysStatement,temp_monSysSQLText上分别建立索引(SPID,BatchID).

监控到的语句很长时,结果集中是分多行的,这很容易看出来.(CpuTime,WaitTime,MemUsageKB,PhysicalReads,LogicalReads等完全一样的).

从上面的过程中可以看出来,通过MDA来进行语句的监控还是有些不方便的,但至少我们有了一个可以进行SQL语句监控,进而进一步分析调优的手段.

三. ASE15的语句监控

ASE15的发布已经快有两年的时间了,目前已经在一些生产环境使用. 它在语句监控这方面,确实给用户提供了极大的方便.

ASE15中,每一个database中都有一个视图 sysquerymetrics.直接通过查询这个视图就可以得到MDA语句监控的结果,而且它对于同样的语句,它自动进行了合并处理,生成执行次数,各项指标的最大值,最小值与平均值,比MDA更加的合理且灵活.

要使用这个视图,需要将参数'enable sysmetrics capture'设置为1:

1>sp_configure 'enable sysmetricscapture',1

2>go

同样,使用这个功能对性能会有一定的影响,建议只有需要监控的时候开启,其它时间把它禁止.更为严重的是,长时间启用这个功能,这个视图使用到的另外一个表sysqueryplans的cluster索引经常会损坏,我多次在不同的环境中碰到这个问题,导致这个系统表的索引需要重建,并需要重新启动数据库服务.所以建议大家,在不需要SQL语句监控的时候,禁止这个功能.如何重建sysqueryplans表的索引,我会另外写一个文档.

大家看看sysquerymetrics表的列就知道它能帮助我们做什么了,这里也就不再示例了:

列名 数据类型 说明

uid int 用户 ID

gid int 组 ID

hashkey int SQL 查询文本上的散列键

id int 唯一 ID

sequence smallint null 在 SQL 文本需要多行的情况下行的序列号

exec_min int null 最短执行时间

exec_max int null 最长执行时间

exec_avg int null 平均执行时间

elap_min int null 最短经历时间

elap_max int null 最长经历时间

elap_avg int null 平均经历时间

lio_min int null 最小逻辑 IO

lio_max int null 最大逻辑 IO

lio_avg int null 平均逻辑 IO

pio_min int null 最小物理 IO

pio_max int null 最大物理 IO

pio_avg int null 平均物理 IO

cnt int null 已经执行的查询次数

abort_cnt int null 查询由于超过资源限制而被资源管理器 (Resource Governor)中止的次数

qtext varchar(255) null 查询文本

此外,ASE15提供了一个存储过程sp_metrics,用来清空,备份sysquerymetrics(实际上是sysqueryplans表).具体见SYBASE官方网站可下载的手册.

从语句监控的三种实现来看, ASE15无疑提供了极为方便的手段,这对SYBASE DBA们来说,无疑是个很好的消息.

0

阅读 (122) 评论 (0) 收藏 (0) 转载 (2) 喜欢 打印 举报
已投稿到:
前一篇: Sybase函数
lileizhang:您还未开通博客,点击一秒开通。
  • 灌水
  • 赞
  • 美好
  • 顶
  • 顶
  • 顶
  • 开心
  • 路过

   

验证码: 请点击后输入验证码 收听验证码

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

< 前一篇 Sybase函数
  

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有

×
博客昵称体系将于近期升级实现昵称唯一,您可通过官方活动验证昵称是否唯一并完成修改。            马上参与》 了解详情》
幻灯播放
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值