待优化的 SQL 大致分两类:
一类是执行时间较长, 但执行频率不高, 此类 SQL 对数据库影响不是很大。
一类是执行时间较短, 但执行频率很高, 此类 SQL 对数据库影响较大, 应优先处理
开启、 配置跟踪日志记录执行 SQL
要开启追踪日志, 可以直接调用函数开启 SP_SET_PARA_VALUE(1,'SVR_LOG',1);
开启后即可在数据库的 log 路径下生成 dmsql_实例名_日期_时分秒.log 的文件
开启后可直接执行 SP_REFRESH_SVR_LOG_CONFIG();
查看 sqllog.ini 参数文件
SQL_TRACE_MASK 默认值为1 表示记录所有语句 如果分类记录SQL则用冒号分隔,如3:5:7 2~17前提是:SQL 标记位 24 也要设置
1 全部记录(全部记录并不包含原始语句)
2 全部 DML 类型语句
3 全部 DDL 类型语句
4 UPDATE 类型语句(更新)
5 DELETE 类型语句(删除)
6 INSERT 类型语句(插入)
7 SELECT 类型语句(查询)
8 COMMIT 类型语句(提交)
9 ROLLBACK 类型语句(回滚)
10 CALL 类型语句(过程调用)
11 BACKUP 类型语句(备分)
12 RESTORE 类型语句(恢复)
13 创建对象操作 (CREATE DDL)
14 修改对象操作 (ALTER DDL)
15 删除对象操作 (DROP DDL)
16 授权操作 (GRANT DDL)
17 回收操作 (REVOKE DDL)
22 绑定参数
23 存在错误的语句(语法错误,语义分析错误等)
24 是否需要记录执行语句
25 是否需要打印计划和语句和执行的时间
26 是否需要记录执行语句的时间
27 原始语句(服务器从客户端收到的未加分析的语句)
28 是否记录参数信息,包括参数的序号、数据类型和值
29 是否记录事务相关事件
FILE_NUM 记录日志的个数,默认值为5。达到此设定值,新生成的日志文件会删除最早的一个。取值范围为0——1024 设置为0,则代表只会有两个日志交替使用
SWITCH_MODE 切换模式,默认值为2。 取值范围0——3
0 不切换
1 按照文件记录数量切换
2 按照文件大小切换
3 按时间间隔切换
SWITCH_LIMIT 不同的切换模式下,代表的含义不同
按照数量切换时,一个日志文件中SQL记录条数达到多少条后进行切换。取值范围1000——10000000
按照文件大小切换时,一个日志文件大小达到后进行切换,单位为M,默认值为128,取值范围1——2000
按照时间切换,单位为分钟,取值范围1——30000
ASYNC_FLUSH 是否开启异步,默认值为1 0关闭,1打开
MIN_EXEC_TIME 记录SQL执行的最小时间,单位为毫秒,默认值为0 取值范围0——4294967294
FILE_PATH 日志的存放路径,默认在数据库软件安装目录下的 log目录下
BUF_TOTAL_SIZE SQL日志BUFFER使用空间上限,单位为KB 默认10240KB 即10M
BUF_SIZE 一块SQL日志BUFFER空间的大小,单位为KB 默认1024KB 即1M
BUF_KEEP_CNT 系统保留的日志缓存个数,默认6 取值范围0——100
PART_STOR 日志分区存储,默认值为0 0表示不区分 1根据用户区分
ITEMS 配置日志中记录的信息 默认值为0,记录所有信息 如果要记录几个,用冒号进行分隔,如 3:5:7
1 TIME 执行的时间
2 SEQNO 服务器的站点号
3 SESS 操作的 SESS 地址
4 USER 执行的用户
5 TRXID 事务 ID
6 STMT 语句地址
7 APPNAME 客户端工具
8 IP 客户端 IP
9 STMT_TYPE 语句类型
10 INFO 记录内容
11 RESULT 运行结果,包括运行用时和影响行数(可能没有)
USER_MODE 日志中按照用户过滤,默认0 0关闭用户过滤 1白名单模式,只记录列出的用户 2 黑名单,记录黑名单之外的用户SQL
USERS 默认为空,只有USER_MODE不为0时起效,格式为 用户名:用户名:用户名
根据追踪日志查找慢SQL
开启日志追踪后会在log目录下生成 “dmsql_实例名_日期_时分秒.log”
可以使用Dmlog工具进行分类汇总
根据系统视图查找慢SQL
可以设置dm.ini参数文件中的ENABLE_MONITOR和MONITOR_TIME参数。默认值都为1,即都是打开状态,可以查询最近1000条超过设定时间的SQL。默认值为1秒(1000毫秒)
可以通过函数在线修改
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);
可以通过查询视图
select * from v$long_exec_sqls;