8.找到运行最慢的 SQL 语句
系统中 20%的 SQL 语句占用了 80%的系统资源,所以 DBA 在优化数据库时,找出和优化运行慢的 SQL 语句至关重要,如何捕获到系统中运行慢的 SQL 语句对很多 DBA 来说非常困难,这里介绍两种有效的方法:当前运行慢的 SQL 和在一段时间内运行慢的 SQL语句。
查询数据库当前运行最慢的 SQL 语句的 SQL 语句如下。
select first 25 sqx_estcost,
sqx_estrows,
sqx_sqlstatement
from sysmaster:syssqexplain
where 1=1
order by sqx_estcost desc;
监控数据库当前运行最慢的 SQL 语句的查询结果如下。
通过查询当前正在执行的 SQL 语句的开销来监控运行慢的 SQL 语句。当数据库非常繁忙时,多次运行该语句,就可以找到那些慢的 SQL 语句。如果要找到数据库中在一段时间内(比如从早上 8 点到 12 点)运行比较慢的 SQL 语句,那么我们需要利用 GBase 8s 的 SQLTRACE 功能。SQLTRACE 功能的使用方法如下:
echo 'execute function task ("set sql tracing on",100000, "1k", "low","dbtest");' | dbaccess sysadmin
说明:
dbtest为跟踪的数据库名;
100000 为最多跟踪的 SQL 语句个数,超过这个数字时,将最早跟踪的 SQL 删除 1K
为每个 SQL 占用的内存,对于特别大的 SQL 语句需要设置更大的值,如 2k、4k。
9.关闭 SQLTRACE 功能
关闭 SQLTRACE 功能的使用方法如下:
echo ' execute function sysadmin:task("SET SQL TRACING OFF"); ' | dbaccess
跟踪分析完成后,一定要关闭。在 SQL-Tracing 开启下将对系统有 2%~5%的性能消耗。另外,关闭后,跟踪的信息(内存)将字典释放,一定要分析完成后再关闭,或者定期把捕获的信息转存到自定义的表(创建三个和 sql-tracing 字典表一致的表即可)中,供进一步分析使用。
10.结果分析
我们可以对 SQL-Tracing 捕获的结果进行分析。
- 顺序扫描的 SQL
select distinct sql_statement
from sysmaster:Syssqltrace t
inner join sysmaster:syssqltrace_iter i
on t.sql_id = i.sql_id
where i.sql_itr_info='Seq Scan';
- 查询速度慢的 SQL
可以通过不同的指标进行排名:
echo "select first 20 * from sysmaster:syssqltrace order by sql_totaltime"| dbaccess dbtest