一、SQL-Tracing介绍
SQL-Tracing提供了关于最近执行的SQL语句的统计信息,以跟踪单个SQL语句的性能并分析历史语句。你可以使用SQL-Tracing来收集每个SQL语句的统计信息,并分析语句的历史。
SQL-Tracing可以帮助你回答诸如:
- SQL语句需要多长时间?
- 单个语句使用了多少资源?
- 语句执行需要多长时间?
每个资源等待的时间有多长?
统计信息存储在一个循环缓冲区中,该缓冲区是一个内存中的伪表,称为syssqltrace,存储在sysmaster数据库中。你可以动态地调整循环缓冲区的大小。默认SQL-Tracing是关闭的,但可以为所有用户开启或者为特定的一组用户开启。当使用默认配置启动SQL-Tracing时,数据库服务器跟踪运行的最后1000条SQL语句,并对这些语句进行概况统计。你也可以在全局或针对特定用户禁用SQL-Tracing。
如果要保存大量的历史信息,SQL-Tracing所需的内存是很大的。SQL-Tracing所需空间的默认量为2MB。可以根据自己的需求扩大或减少存储量。
显示的信息包括:
- 运行该命令的用户ID
- 数据库会话ID
- 数据库的名称
- SQL语句的类型
- SQL语句执行的持续时间
- 当前语句完成的时间
- 例如,SQL语句的文本或带有语句类型的函数调用列表(也称为堆栈跟踪):procedure1()调用procedure2()调用procedure3()
统计信息包括:
- 缓冲区读写次数
- 读写页数
- 种类数和磁盘种类数
- 锁请求数和等待数
- 逻辑日志记录的数量
- 索引缓冲区的读数
- 估计行数
- 优化器预估开销值
- 返回的行数
- 数据库隔离级别。
您还可以指定跟踪级别,如下所示: - 默认情况下启用的低级跟踪捕捉到了下例所示的信息。这些信息包括语句统计信息、语句文本信息和语句迭代器信息。
- 中级跟踪捕获了低级跟踪中包含的所有信息,以及表名、数据库名和存储过程栈的列表。
高级跟踪捕获了中级跟踪中包含的所有信息,加上宿主变量。
追溯的信息量影响着历史数据所需的内存量。可以在任意时间点启用和禁用跟踪,并且可以在数据库服务器运行时更改跟踪缓冲区的数量和大小。如果调整跟踪缓冲区的大小,则数据库服务器试图维护缓冲区的内容。如果增加参数,数据不会被截断。但是,如果减少缓冲区的数量或大小,则跟踪缓冲区中的数据可能会被截断或丢失。
缓冲区的数量决定了被跟踪的SQL语句的数量。每个缓冲区包含单个SQL语句的信息。默认情况下,单个跟踪缓冲区为固定大小。如果存储在缓冲区中的文本信息超过跟踪缓冲区的大小,则对数据进行截断。
下面举例说明SQL-Tracing信息:
select * from syssqltrace where sql_id = 5678; sql_id 5678 sql_address 4489052648 sql_sid 55 sql_uid 2053 sql_stmttype 6 sql_stmtname INSERT sql_finishtime 1140477805 sql_begintxtime 1140477774 sql_runtime 30.86596333400 sql_pgreads 1285 sql_bfreads 19444 sql_rdcache 93.39127751491 sql_bfidxreads 5359 sql_pgwrites 810 sql_bfwrites 17046 sql_wrcache 95.24815205913 sql_lockreq 10603 sql_lockwaits 0 sql_lockwttime 0.00 sql_logspace 60400 sql_sorttotal 0 sql_sortdisk 0 sql_sortmem 0 sql_executions 1 sql_totaltime 30.86596333400 sql_avgtime 30.86596333400 sql_maxtime 30.86596333400 sql_numiowaits 2080 sql_avgiowaits 0.014054286131 sql_totaliowaits 29.23291515300 sql_rowspersec 169.8958799132 sql_estcost 102 sql_estrows 1376 sql_actualrows 5244 sql_sqlerror 0 sql_isamerror 0 sql_isollevel 2 sql_sqlmemory 32608 sql_numiterators 4 sql_database db3 sql_numtables 3 sql_tablelist t1 sql_statement insert into t1 select {+ AVOID_FULL(sysindices) } 0, tabname
二、使用SQLTRACE配置参数指定启动SQL-Tracing信息
使用SQLTRACE配置参数控制数据库服务器启动时的默认跟踪行为。默认情况下,这个参数是不设置的。设置的信息包括要跟踪的SQL语句数量和跟踪模式。任何可以修改onconfig文件的用户都可以修改SQLTRACE配置参数的值,从而影响启动配置。然而,只有用户gbasedbt、root或被授予系统管理员数据库连接权限的DBSA才能使用SQL管理API命令来修改SQL-Tracing的运行时状态。
在数据库服务器启动时指定SQL-Tracing信息:
1.在onconfig文件中设置SQLTRACE配置参数。
2.重新启动数据库服务器。
举例:
在onconfig文件中的以下设置指定数据库服务器收集系统上所有用户执行的最多2000条SQL语句的低级信息,并分配大约4MB的内存( 2000 * 2KB)。
SQLTRACE level=LOW,ntraces=2000,size=2,mode=global
如果只使用分配的缓冲区空间(例如,42%的缓冲空间)的一个百分比,则分配的内存量仍为2KB。
如果不想设置SQLTRACE配置参数,重启服务器,可以运行下面的SQL管理API命令,为当前会话提供与设置SQLTRACE相同的功能:
EXECUTE FUNCTION task("set sql tracing on", 100,"1k","med","user");
在用户模式下启用SQL-Tracing系统后,即可对每个用户启用跟踪。
三、在全局或会话中禁用SQL-Tracing
即使SQLTRACE配置参数中指定的模式是全局的或用户的,如果想要完全关闭所有用户和全局跟踪,并通过SQL-Tracing重新分配当前使用的资源,就可以禁用SQL-Tracing。默认情况下,对所有用户关闭SQL-Tracing。
必须以用户gbasedbt或另一授权用户的身份连接到系统管理员数据库。
为了禁用全局SQL-Tracing,运行SQL管理API task ()或admin ()函数,并设置sql跟踪参数。
为禁用特定会话的SQL-Tracing,运行SQL管理API task ()或admin ()函数,设置sql跟踪为第一个参数,会话标识号为第二个参数。
举例:
下面的示例全局禁用SQL-Tracing:
EXECUTE FUNCTION task('set sql tracing off');
(expression) SQL tracing off.
1 row(s) retrieved.
下面的例子使ID为47的会话无法进行SQL-Tracing:
EXECUTE FUNCTION task("set sql user tracing off",47);
四、启用SQL-Tracing
在将用户指定为SQLTRACE配置参数中的模式后,必须运行SQL管理API task ()或admin ()函数,才能对特定的用户进行SQL历史跟踪。
必须以用户gbasedbt或另一授权用户的身份连接到系统管理员数据库。
不需要启用全局SQL-Tracing就可以对特定用户进行SQL-Tracing。
为了实现对特定用户的SQL-Tracing,运行SQL管理API task ()或admin ()函数,设置sql跟踪作为第一个参数,用户会话ID作为第二个参数。
为了实现对除root或gbasedbt以外的所有用户的SQL-Tracing,可以运行task ()或admin ()函数,并使用sql对定义用户的参数和信息进行跟踪。
举例:
下面的例子实现了对会话ID为74的用户进行SQL-Tracing:
EXECUTE FUNCTION task("set sql user tracing on", 74);
下面的例子可以实现跟踪当前连接到系统的用户的SQL语句,只要他们没有作为用户root或gbasedbt登录。
dbaccess sysadmin -<<END
execute function task("set sql tracing on", 1000, 1,"low","user");
select task("set sql user tracing on", session_id)
FROM sysmaster:syssessions
WHERE username not in ("root","gbasedbt");
END
五、为会话启用全局SQL-Tracing
通过运行SQL管理API task ()或admin ()函数,可以为当前会话启用全局SQL-Tracing。
必须以用户gbasedbt或另一授权用户的身份连接到系统管理员数据库。
默认情况下,不启用全局SQL-Tracing。可以通过设置SQLTRACE配置参数来永久启用全局跟踪。
为了实现对当前数据库服务器会话的全局用户SQL历史跟踪,用设置在参数上的sql跟踪来运行SQL管理API task ()或admin ()函数。
举例:
下面的例子可以实现对所有用户的全局低级SQL-Tracing:
EXECUTE FUNCTION task("set sql tracing on", 1000, 1,"low","global");
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。