本文摘自GBASE南大通用社区,by:wty,原文请点击:GBase 8s常见问题 -- 追踪统计SQL执行情况 SQLTRACE|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商
问题现象
某些SQL执行慢、有问题,又找不到对应的SQL时,可以尝试使用SQLTRACE来查问题SQL,或者统计一段时间内的SQL执行情况
解决方法
使用dbaccess连接sysadmin系统库,执行task函数
[gbasedbt@test15 ~]$ dbaccess sysadmin -
Database selected.
> execute function task("SET SQL TRACING ON", 50000,"4k","high","global");
(expression) SQL Tracing ON: ntraces=50000, size=4056, level=High, mode=Global
.
1 row(s) retrieved.
>
“SET SQL TRACING ON” : 开启SQLTRACE命令
50000 : 要跟踪的 SQL 语句的数目。默认 1000。超出后会删除旧的数据。
“4k” : 跟踪缓冲区大小的 KB 数。如果超过这个缓冲区大小,则数据库服务器丢弃保存的数据。默认 2 KB。
“high” : 跟踪级别。缺省为 low。
使用 low 参数来捕获语句统计、语句文本和语句迭代器。
使用 med 参数来捕获包括在低级跟踪的所有信息,加上表名、数据库名和存储过程堆栈。
使用 high 参数来捕获包括在中级跟踪的所有信息,加上主机变量。
使用 global 参数来启用对所有用户的跟踪。
使用 user 参数来启用跟踪那些由 set sql tracing user 参数启用跟踪的用户。
“global” :跟踪所有用户还是选中的用户。 可以选 global、user
关闭SQLTRACE
[gbasedbt@test15 ~]$ dbaccess sysadmin -
Database selected.
> execute function task("SET SQL TRACING OFF");
(expression) SQL Tracing OFF.
1 row(s) retrieved.
>
也可以在命令行使用echo给dbaccess传SQL语句执行
[gbasedbt@test ~]$ echo 'execute function task("SET SQL TRACING ON", 50000,"4k","high","global")'|dbaccess sysadmin
Database selected.
(expression) SQL Tracing ON: ntraces=50000, size=4056, level=High, mode=Global
.
1 row(s) retrieved.
Database closed.
[gbasedbt@test ~]$ echo 'execute function task("SET SQL TRACING OFF")'|dbaccess sysadmin
Database selected.
(expression) SQL Tracing OFF.
1 row(s) retrieved.
Database closed.
查询SQLTRACE统计信息
使用SQL在sysmaster系统库中查syssqltrace表,建议适当使用group by / order by配合where条件进行统计
select * from sysmaster:syssqltrace
列 | 类型 | 描述 |
---|---|---|
sql_id | int8 | 唯一 SQL 执行 ID |
sql_address | int8 | 代码块中语句的地址 |
sql_sid | int | 运行 SQL 语句的用户的数据库的会话 ID |
sql_uid | int | 运行 SQL 的语句的用户 ID |
sql_stmttype | int | 语句类型 |
sql_stmtname | char(40) | 显示为单词的语句类型 |
sql_finishtime | int | 次语句的完成时间 (UNIX™) |
sql_begintxtime | int | 此事务的启动时间 |
sql_runtime | float | 语句执行时间 |
sql_pgreads | int | 此 SQL 语句的磁盘读取数 |
sql_bfreads | int | 此 SQL 语句的缓冲区读取数 |
sql_rdcache | float | 从缓冲池读取页的时间百分比 |
sql_bfidxreads | int | 索引页缓冲区读取数 |
sql_pgwrites | int | 写入磁盘的页数 |
sql_bfwrites | int | 已修改并返回到缓冲池的页数 |
sql_wrcache | float | 页已写入缓冲池,但未写入磁盘的时间百分比 |
sql_lockreq | int | 此 SQL 语句所需锁总数 |
sql_lockwaits | int | SQL 语句等待锁的次数 |
sql_lockwttime | float | SQL 语句期间系统等待锁定的时间 |
sql_logspace | int | 逻辑日志中 SQL 语句所用空间量 |
sql_sorttotal | int | 为语句运行的排序数 |
sql_sortdisk | int | 磁盘上运行的排序数 |
sql_sortmem | int | 内存中运行的排序数 |
sql_executions | int | SQL 语句运行的次数 |
sql_totaltime | float | 运行语句所用的时间总量 |
sql_avgtime | float | 运行语句所用的平均时间 |
sql_maxtime | float | 执行 SQL 语句所使用最大时间量 |
sql_numiowaits | int | I/O 操作必须等待的次数 |
sql_avgiowaits | float | SQL语句必须等待的平均时间量 |
sql_totaliowaits | float | SQL 语句必须等待 I/O 的时间总量。这不包含任何异步 I/O |
sql_rowspersec | float | 产生的平均行数(每妙) |
sql_estcost | int | 与SQL 语句关联的成本 |
sql_estrows | int | 按照优化器的预测为 SQL 语句返回的预估计行数 |
sql_actualrows | int | 为 SQL 语句返回的行数 |
sql_sqlerror | int | SQL 错误号 |
sql_isamerror | int | RSAM/ISAM 错误编号 |
sql_isollevel | int | SQL 语句的隔离级别 |
sql_sqlmemory | int | 执行 SQL 语句所需字节数 |
sql_numiterators | int | 语句所用迭代器数 |
sql_database | char(128) | 数据库名称 |
sql_numtables | int | 执行 SQL 语句中所用表数 |
sql_tablelist | char(4096) | SQL 语句中直接引用的表名列表。如果 SQL 语句激发对其他表执行语句的触发器,将不列出这些表 |
sql_statement | char(1600) | 已运行的 SQL 语句 |