祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 11388|回复: 1

[参考资料] 关于SYBASE ASE各个版本的语句监控实现

[复制链接]

[参考资料] 关于SYBASE ASE各个版本的语句监控实现

[复制链接]
quanjin

主题

0

回帖

571

积分

高级会员

积分
571
贡献
在线时间
小时
2009-5-11 17:21:11 | 显示全部楼层 |阅读模式

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

您需要 登录 才可以下载或查看,没有账号?站点注册

×
众所周知,系统调优很重要的一个方面是应用的调优. 而基于数据库的应用中,最重要的工作之一就是进行SQL语句的调优. SYBASE ASE以前的版本中,很难实现语句监控,从而进一步分析,优化相关的语句,也就很难对已经投入生产的应用进行进一步调优. ASE12.5.0.3开始,增加了很多的系统监控表,称为MDA table,实际上是一些proxy table. 通过这些表可以完整地进行了系统监控,包括数据缓存监控,存储过程缓存监控,索引使用监控等,其中非常重要的一个部分是SQL语句的监控,它弥补了以前ASE性能调优重要的一个方面.详细内容大家可以参照sybase的官方文档:http://manuals.sybase.com/online ... g1251c/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 printed error messages, contact a user with

System Administrator (SA) role.

1> dbcc sqltext(1029)

2> go

SQL Text: select

btypeid,cname,atypeid,bureauid,deptid,llevel,baseval,range,remark from

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 printed error messages, contact a user with
System Administrator (SA) role.
其中1029是用户连接的sid.这种监控的方法能找到某个用户正在执行的语句. 但这种方法对于希望找出系统中最消耗资源的SQL语句,怕是无能为力. 对于由于不良的SQL语句导致的系统性能低下,DBA简直无能无力.
二: ASE12.5.0.3及以后版本的监控
ASE12.5.0.3开始,提供了一整套用于系统监控的proxy table. 默认安装下,这些新的监控表数据库中是没有的,需要执行以下步骤安装,这里假设用户的server名为SYBASE:

1. 增加loopback服务

1>use master

2>go

1>sp_addserver loopback, null, SYBASE

2>go

2. 在CMD下,执行脚本installmontables,安装MDA表,这些表会安装在master数据库中.
isql -Usa -P -Ssa -i%SYBASE%ASE-12_5scriptsinstallmontables
3、给sa授权mon_role(监控用户)权限
1>grant role mon_role to sa

2>go

4, 配置相关参数
用sa登录,配置以下参数:
1>sp_configure 'max SQL text monitored',2000
2>go

1>sp_configure 'SQL batch capture',1

2>go

1>sp_configure 'sql text pipe max messages',30000

2>go

1>sp_configure 'sql text pipe active',1

2>go

1>sp_configure 'statement statistics active',1

2>go

1>sp_configure 'per object statistics active',1

2>go

1>sp_configure 'statement pipe max messages',30000

2>go

1>sp_configure 'statement pipe active',1

2>go

1>sp_configure 'enable monitoring',1

2>go

1>shutdown

2>go
上述参数中'max SQL text monitored'是静态的,配置完后,需要重新启动后才能生效。这些参数的具体含义大家看一下通过上面的链接下载的手册就知道了.其中sp_configure 'enable monitoring',1是启用监控,启用监控对系统的性能会有一定的影响,所以在不需要监控的时候,把它置为0,关闭监控:
sp_configure 'enable monitoring',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..monProcessStatement S, master..monProcessSQLText T where S.SPID = T.SPID order by LogicalReads desc
用户可以根据需要选择其它的列进行排序,找出当前正在运行的消耗资源的SQL语句.
b. 查看最近一段时间内的SQL语句执行情况.
为方便语句监控,我建立了四个存储过程, 这里假设用户库名中TEST:

use TEST

go
/*用来在用户库中中建立两个用来存放monSysStatement,monSysSQLText的固定表 */
create procedure sp_monCreate

as

if exists (select 1 from sysobjects where name='temp_monSysStatement')

exec ('drop table temp_monSysStatement')
if exists (select 1 from sysobjects where name='temp_monSysSQLText')
exec ('drop table temp_monSysSQLText')

select * into temp_monSysStatement from master..monSysStatement where 1=2

select * into temp_monSysSQLText from master..monSysSQLText where 1=2

go
/*生成固定表 */
exec sp_monCreate

go
/*清除固定表的数据 */
create procedure sp_monPurge

as

truncate table temp_monSysStatement

truncate table temp_monSysSQLText

go

/*把monSysStatement,monSysSQLText表中的数据保存到两个固定表中 */

create procedure sp_monCollect

as

insert temp_monSysStatement select * from master..monSysStatement

insert temp_monSysSQLText select * from master..monSysSQLText

go
/* 生成语句监控结果,这里按LogicalReads排序,可以按自己的需要调整. 数据库版本在ASE12.5.3之上时,可以在语句前面加上top n, 得到前几条*/
create procedure sp_mon

as

select /* top 1000 */ DBID,S.SPID,T.SequenceInBatch,CpuTime,WaitTime,MemUsageKB,PhysicalReads,LogicalReads,PagesModified,

SQLText from TEST..temp_monSysStatement S,TEST..temp_monSysSQLText T where S.SPID=T.SPID and S.BatchID=T.BatchID order by LogicalReads desc

go
监控过程如下:
(1). 执行sp_monPurge,清除上次监控时留下的数据
(2). 启用监控 sp_configure 'enable monitoring',1

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

(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 sysmetrics capture',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们来说,无疑是个很好的消息.

评分

参与人数 1威望 +12 收起 理由
ehxz + 12 绮惧搧鏂囩珷

查看全部评分

共享共进共赢Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
ehxz

主题

0

回帖

57万

积分

管理员

积分
571364
贡献
在线时间
小时
2009-5-14 14:46:40 | 显示全部楼层
加精!
共享共进共赢Sharing And Win-win Results
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2024-5-4 15:30 , Processed in 0.048498 second(s), 8 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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