Adaptive Server 提供一组系统表,这些表中包含监控信息和诊断信息。这些表中的信息为您提供了 Adaptive Server 状态的统计快照,能让您分析服务器以便分析服务器性能。例如,您可以执行查询以报告有关服务器进程和应用程序的活动、查询性能、数据库表的使 用情况、数据高速缓存的效率、数据库设备上的 I/O 活动以及 AdaptiveServer 影响系统性能的许多其它方面的信息。
监控表中的数据不存储在磁盘上。当您在一个监控表上执行查询时,数据便会被计算。表定义包含在服务器安装脚本所创建的代理表定义中。当您执行查询时,这些代理表使用一个到 Adaptive Server 的接口来收集监控数据。
需使用服务器安装脚本创建监控表
Adaptive Server 15.0.2 版和更高版本以及 Cluster Edition 的监控表:
• 当您运行 installmaster 脚本时安装
• 使用物化视图
• 要求您创建回送服务器
低于 15.0.2 的版本,使用位于 $SYBASE/ASE-15_0/scripts 目录 (对于 Windows 为 %SYBASE%\ASE-15_0\scripts)中的 installmontables 脚本创建监控表。
isql -Usa -Ppassword -Sserver_name -i $SYBASE/ASE-15_0/scripts/installmontables
缺省情况下,Adaptive Server 不收集监控表所需的监控信息。使用sp_configure 将配置 Adaptive Server 为开始收集监控信息。
若要配置 Adaptive Server 以收集常规监控信息,请执行以下操作(默认为启用状态):
sp_configure “enable monitoring”, 1
当您输入以下命令时,Adaptive Server 会显示专用于监控的配置参数的完整列表:
sp_configure Monitoring
用于控制监控信息收集的配置参数有:
• enable monitoring • deadlock pipe active • deadlock pipe max messages • errorlog pipe active • errorlog pipe max messages • max SQL text monitored • object lockwait timing • per object statistics active • plan text pipe active • process wait events • sql text pipe active • sql text pipe max messages • statement pipe active • statement pipe max messages • statement statistics active • SQL batch capture • wait event timing
- 为管道错误消息分配内存
许多监控表使用内存缓冲区(称为“管道”)来收集监控数据。以下参数可控制为每个管道分配的内存量:
• deadlock pipe max messages • errorlog pipe max messages • sql text pipe max messages • plan text pipe max messages • statement pipe max message
Adaptive Server 可以动态向管道中添加内存,但无法动态从中删除内存,因此,如果减小管道参数的大小,则必须重新启动 Adaptive Server 才能让新的管道大小生效。
- mon_role 和其它访问控制
只有具有 mon_role 的用户才可以访问这些监控表。只有被授予此角色的用户可以在监控表上执行查询。可以授予或撤消特定登录名、角色或组对监控表的 select 权限,从而向部分(或全部)监控表添加其它访问控制。
- 有态历史监控表
许多监控表提供各个事件的记录,而不是有关当前状态的信息。这些表称为“历史的”,因为这些表中报告的事件提供服务器在一段时间内的历史记录。Adaptive Server 维护访问历史表的每个客户端连接的上下文信息,而且,在对该表进行的每个后续查询中仅返回客户端以前没有收到的行。历史监控表的这种“有态”属性旨在最大限度地提高性能,以及在用于填充历史数据的存储库时避免重复行。
历史监控表有:
• monErrorLog • monDeadLock • monSysStatement • monSysSQLText • monSysPlanText
- 瞬时监控数据
由于监控表经常包含瞬时数据,因此在查询中连接或使用集合时要小心:如果查询计划要求多次查询表,则这些操作返回的结果可能不同。例如:
select s.SPID, s.CpuTime, s.LineNumber, t.SQLText from master..monProcessStatement s, monProcessSQLText t where s.SPID=t.SPID and s.CpuTime = (select max(CpuTime) from master..monProcessStatement)
此示例查询 monProcessStatement 两次,首先查找最大 CpuTime,然后匹配这个最大值。当 Adaptive Server 执行第二次查询时,从 monProcessStatement 返回的潜在结果有三种:
• 该语句执行更多工作,消耗更多 CPU,使 CpuTime 值大于前一个最大值,因此,where 子句中没有匹配项,查询不返回任何结果。
• 该语句在第二个查询执行之前就已执行完毕,不生成任何结果,除非另一个语句使用的 CPU 量完全和上次获取的最大值相同。
• 该语句不使用任何其它的 CPU,并且它的 CpuTime 值仍然与最大值匹配。只有这种情况会生成预期的结果。
建议您在分析监控表中的数据之前,将其保存在临时表或存储库中。这样做会冻结数据并消除由于瞬时数据或历史监控表的无态性质可能造成的意外结果。
Adaptive Server 语句高速缓存一旦启用,便可存储即席 update、delete 和 select 命令以及其它可能重用的语句的 SQL 文本。启用语句高速缓存后,这些语句的查询计划会被保存以便重用。发出新语句后,Adaptive Server 将搜索要重用的计划的语句高速缓存。如果 Adaptive Server 找到可重用的计划,则无需重新编译语句,因此会提高性能。
配置 Adaptive Server 以监控语句高速缓存
使用 enable stmt cache monitoring 可配置 Adaptive Server 以收集有关语句高速缓存的监控信息。
sp_configure 'stmt cache monitoring',enable ----确认是否已enable,执行sp_configure 'stmt cache monitoring',
显示高速缓存语句的文本和参数信息
使用 show_cached_text 可查看高速缓存语句的 SQL 文本。show_cached_text 将语句 ID 用作输入,并显示相应语句的文本和参数信息。语法为:
select show_cached_text(SSQLID)
使用 show_cached_text 可在查询中获取语句高速缓存中的语句的文本。例如:
select SSQLID, show_cached_text(SSQLID) from master..monCachedStatement
• 若要返回所有可用监控表的列表:
select TableName from master..monTables
• 若要列出特定监控表中的列,请输入:
select ColumnName, TypeName, Length, Description from master..monTableColumns where TableName=”monProcessSQLText”
通过在 where 子句中替代任一监控表的名称并运行查询,您可以确定此监控表中存在哪些列。
• 若要确定当前执行的查询中哪些最消耗 CPU 并列出这些查询的文本,请输入:
select s.SPID, s.CpuTime, t.LineNumber, t.SQLText from master..monProcessStatement s, master..monProcessSQLText t where s.SPID = t.SPID order by s.CpuTime DESC
• 若要确定 Adaptive Server 生存周期内的过程高速缓存的命中率,请输入:
select "Procedure Cache Hit Ratio" = (Requests-Loads)*100/Requests from master..monProcedureCache
- 以下查询还提供数据高速缓存的命中率。在此示例中,命中率是针对 10 分钟的间隔计算的,而不是针对服务器的整个生存周期:
select * into #moncache_prev from master..monDataCache waitfor delay "00:10:00" select * into #moncache_cur from master..monDataCache select p.CacheName, "Hit Ratio"=((c.LogicalReads-p.LogicalReads) - (c.PhysicalReads - p.PhysicalReads))*100 / (c.LogicalReads - p.LogicalReads) from #moncache_prev p, #moncache_cur c where p.CacheName = c.CacheName
• 若要创建一个存储过程,用以输出已执行的 SQL 以及当前执行存储过程的所有进程的反馈,请输入:
create procedure sp_backtrace @spid int as begin select SQLText from master..monProcessSQLText where SPID=@spid print "Stacktrace:" select ContextID, DBName, OwnerName, ObjectName from master..monProcessProcedures where SPID=@spid end
• 若要确定用于 dbid 为 5、对象 ID 为 1424005073 的数据库中的表的任何索引,请输入:
select DBID, ObjectID, LastUsedDate, UsedCount from master..monOpenObjectActivity where dbid=5 and ObjectID=1424005073 and IndexID > 1
若要确定可否删除不被在服务器上运行的应用程序使用的索引,请执行以下操作:
a 在访问相关表的应用程序中运行所有查询。确保 Adaptive Server 运行足够长时间,以便所有应用程序都执行其 select。
b 若要确定您的应用程序是否未在数据库中使用任何索引,请执行:
select DB = convert(char(20), db_name()), TableName = convert(char(20), object_name(i.id, db_id())), IndexName = convert(char(20),i.name), IndID = i.indid from master..monOpenObjectActivity a, sysindexes i where a.ObjectID =* i.id and a.IndexID =* i.indid and (a.UsedCount = 0 or a.UsedCount is NULL) and i.indid > 0 and i.id > 99 -- No system tables order by 2, 4 asc
说明:显示性能信息。
语法
sp_sysmon begin_sample sp_sysmon { end_sample | interval }[, section[, applmon] ] [, 'cache wizard' [, top_N [, filter] ]
参数
begin_sample 开始采样。如果指定了 begin_sample,则不能指定部分。 section 是 sp_sysmon 输出的部分中某一个部分的缩写。报告部分的值和相应名称为:
参数 | 报告部分 |
---|---|
appmgmt | 返回表达式的绝对值。 |
dcache | 数据高速缓存管理 |
diskio | 磁盘 I/O 管理 |
esp | ESP 管理 |
indexmgmt | 索引管理 |
kernel | 内核使用率 |
locks | 锁管理 |
memory | 内存管理 |
mdcache | 元数据高速缓存管理 |
monaccess | 对执行 SQL 的监控访问 |
netio | 网络 I/O 管理 |
parallel | 并行查询管理 |
pcache | 过程高速缓存管理 |
recovery | 恢复管理 |
taskmgmt | 任务管理 |
xactmgmt | 事务管理 |
xactsum | 事务配置文件 |
wpm | 工作进程管理 |
示例 1 在 10 分钟后输出监控信息:
sp_sysmon "00:10:00"
示例 2 在 5 分钟后只输出 sp_sysmon 报告的“磁盘管理”部分:
sp_sysmon "00:05:00", diskio ----diskio修改为上表中的其他参数,即可输出相关信息