1 前言
1.1 性能优化的概念
性能优化是指在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。达梦数据库性能优化主要包含以下内容:
- 数据库架构优化
- 数据库参数优化
- SQL 优化
- 统计信息
1.2 工具与术语
数据库性能优化中可能使用到的相关工具:
- 达梦 SQL 日志分析工具 DMLOG:通过分析数据库的 SQL 日志文件,直观地反映 SQL 执行情况。
- 命令行调试工具 dmdbg:DM 数据库安装目录的“bin”子目录下可找到 dmdbg 执行程序,可调试直接执行的 DMSQL 程序或非 DDL 的 SQL 语句。
- DM 性能监控工具 Monitor:Monitor 是 DM 系统管理员用来监视服务器的活动和性能情况的客户端工具。它允许系统管理员在本机或远程监控服务器的运行状况,并根据系统情况对系统参数进行调整,以提高系统效率。
数据库性能优化中可能使用到的相关术语:
- 通配符:通配符是一种特殊语句,主要有星号 (*) 和问号 (?),用来模糊搜索文件。
- 回滚段 (rollback segments):用于临时存储数据库还原信息。
- 统计信息:对象统计信息描述了对象数据的分布特征。统计信息是优化器的代价计算的依据,可以帮助优化器较精确地估算成本,对执行计划的选择起着至关重要的作用。
- CBO(基于代价的优化器):它是看语句的代价,这里的代价主要指 cpu 和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息,统计信息给出表的大小、多少行、每行的长度等信息。
- 执行计划:执行计划是一条 SQL 语句在数据库中的执行过程或访问路径的描述。
2 数据库架构优化
达梦数据库提供多种数据库架构,用于解决多种场景的数据库安全、性能等问题。在实际业务场景中,根据业务的特性,选择合适的数据库架构:
数据库架构 | 架构介绍 | 架构特性 |
---|---|---|
数据守护集群 DMDataWatch | DMDataWatch 是一种高可用数据库解决方案,主备节点通过日志同步来保证数据的同步,可以实现数据库快速切换与灾难性恢复,满足用户对数据安全性和高可用性的需求,提供不间断的数据库服务。 | 实时保证数据完全一致,备库支持临时表,故障秒级切换。 |
读写分离集群 DMRWC | DMRWC 在保障主库和备库事务强一致的前提下,开创性地在接口层(JDBC、DPI 等)将只读操作自动分流到备库,有效降低主库的负载,提升系统吞吐量,适用于读多写少的业务场景。 | 事务自动分发,OA 办公系统的最佳选择,高可用性。 |
数据共享集群 DMSC | DMSC 是一个多实例、单数据库的系统。主要由数据库和数据库实例、共享存储、本地存储、通信网络、以及集群控制软件 DMCSS 组成,允许多个数据库实例同时访问,获得完整的数据库服务。 | 金融级高可用,自动负载均衡,应用高效迁移,高性能存储管理,企业级容灾,全面支持国产平台。 |
新一代分布式集群 DMDPC | DMDPC 同时支持在线分析处理和在线事务处理,具备高可用、高扩展、高性能、高吞吐量,继承了 DM8 良好的兼容性,应用无需改造即可迁移到 DMDPC。 | 高可用、高可扩展、高性能、高吞吐量,透明易用。 |
3 数据库参数优化
3.1 INI参数配置说明
参数 | 含义 | 优化建议 |
---|---|---|
MEMORY_POOL | 共享内存池大小,以 M 为单位。 | 高并发时应调大,避免频繁向 OS 申请内存。 |
MEMORY_N_POOLS | 共享内存池个数,减少内存临界区冲突。 | 设置较大会导致启动时报错申请内存失败。 |
BUFFER | 系统缓冲区大小,以 M 为单位。 | 如果数据量小于内存,则设置为数据量大小;否则设置为总内存的 2/3 比较合适。 |
BUFFER_POOLS | BUFFER 系统分区数,有效值范围(1~512),当 MAX_BUFFER>BUFFER 时,动态扩展的缓冲区不参与分区。 | 并发较大的系统需要配置该参数,减少数据缓冲区并发冲突,建议 BUFFER=MAX_BUFFER。 |
RECYCLE | RECYCLE 缓冲区大小,以 M 为单位。 | 高并发或大量使用 with、临时表、排序等时,可以将值调大。 |
DICT_BUF_SIZE | 字典缓冲区大小,以 M 为单位。 | 如果数据库中对象数量较多,或者存在大量分区表,可适当调大。 |
HJ_BUF_GLOBAL_SIZE | HASH 连接操作符的数据总缓存大小(>= HJ_BUF_SIZE),系统级参数,以 M 为单位。 | 内存足够的情况下,可以适当调大。实际使用大小,由包含 HASH JOIN 操作符的 SQL 并发数决定。 |
HJ_BUF_SIZE | 单个 HASH 连接操作符的数据总缓存大小,以 M 为单位。 | 在 OLTP 环境中,建议采用默认值。在 OLAP 环境下,可以根据参与 HASH JOIN 的数据量调大。 |
HAGR_BUF_GLOBAL_SIZE | HAGR、DIST、集合操作、SPL2、NTTS2 以及 HTAB 操作符的数据总缓存大小(>= HAGR_BUF_SIZE),系统级参数,以 M 为单位。 | 高并发、大量的聚集操作如 sum 等,可适当调大。 |
HAGR_BUF_SIZE | 单个 HAGR、DIST、集合操作、SPL2、NTTS2 以及 HTAB 操作符的数据总缓存大小,以 M 为单位。 | 监控 V$SORT_HISTORY,判断是否需要调整,有大表的 hash 分组应调大。 |
WORKER_THREADS | 工作线程的数目。有效值范围(1~64)。 | 建议设置为 cpu 核数或其两倍。 |
ENABLE_MONITOR | 用于打开或者关闭系统的监控功能。1:打开;0:关闭。 | 性能优化时设置为 3,运行时设置为 2。 |
OLAP_FLAG | 启用联机分析处理。0:不启用;1:启用;2:不启用,同时倾向于使用索引范围扫描。 | 该参数会影响到计划的生成。在 OLTP 环境下,通常保持默认值 2。 |
SORT_BUF_SIZE | 原排序机制下,排序缓存区最大值,以 M 为单位。 | 建索引时可以适当调大,通常不超过 20M。 |
TOP_ORDER_OPT_FLAG | 优化带有 TOP 和 ORDER BY 子句的查询,使得 SORT 操作符可以省略。 | 优化的效果是尽量使得 ORDER BY 的排序列所对应的基表可以使用包含排序列的索引,从而可以移除排序 SORT 操作符,减少排序操作。 |
MAX_OPT_N_TABLES | 优化器在处理连接时,一次能优化的最大表连接个数。默认 6,取值范围 3~8 。 | 在表关联过多但结果集返回较少的场景可能有作用,减少该值可能会调整表关联之间顺序。 |
MAX_OPT_N_OR_BEXPS | 能参与优化的最大 OR 分支个数,取值范围 7~64 。 | 当查询 or 分支过多时可以考虑调大该值,确保 or 的条件能够根据实际情况正确访问。 |
SUBQ_CVT_SPL_FLAG | 控制相关子查询的实现方式,0:不优化;1:使用 SPL2 方式实现相关子查询;2:DBLINK 相关子查询是否转换为函数,由参数 ENABLE_DBLINK_TO_INV 取值决定;4:将多列 IN 转换为 EXISTS;8:将引用列转换为变量 VAR;16:用临时函数替代查询项中的相关查询表达式;32:存储过程、语句块中的多列表达式过滤条件含有非相关子查询时转换为连接。支持使用上述有效值的组合值,如 5 表示同时进行 1 和 4 的优化。 | / |
OPTIMIZER_OR_NBEXP | OR 表达式的优化方式。0:不优化;1:生成 UNION_FOR_OR 操作符时,优化为无 KEY 比较方式;2:OR 表达式优先考虑整体处理方式;4:相关子查询的 OR 表达也优先考虑整体处理方式;8:OR 布尔表达式的范围合并优化;16:同一列上同时存在常量范围过滤和 IS NULL 过滤时的优化,如 C1 > 5 OR C1 IS NULL。支持使用上述有效值的组合值,如 7 表示同时进行 1、2、4 的优化。 | 在 WHERE 后有 OR 条件的情形使用,可以将多个条件过滤合并成一次过滤,减少分支数从而降低表扫描行数。 |
ENABLE_RQ_TO_NONREF_SPL | 0:不启用该优化;1:对查询项中出现的相关子查询表达式进行优化处理;2:对查询项和 WHERE 表达式中出现的相关子查询表达式进行优化处理;4:相关查询采用 SPL 方式去相关性后,可以作为单表过滤条件。支持使用上述有效值的组合值,如 3 表示同时进行 1 和 2 的优化。 | 相关查询表达式转化为非相关查询表达式,目的在于相关查询表达式的执行处理由之前的平坦化方式转化为一行一行处理。 |
VIEW_PULLUP_FLAG | 是否对视图进行上拉优化,把视图转换为其原始定义,消除视图。 | 优化的原理是直接将过滤条件下推到表上过滤。 |
FILTER_PUSH_DOWN | 对单表条件是否下放的不同处理方式。0:表示条件不下放;2:表示在新优化器下对外连接、半连接进行下放条件优化处理;4:表示语义分析阶段考虑单表过滤条件的选择率,超过 0.5 则不下放,由后面进行代价计算选择是否下放,参数值 4 仅在参数取值包含 2 时有效,即将参数值设为 6 时有效;8:表示尝试将包含非相关子查询的布尔表达式进行下放;16:表示 where 条件尽可能下放,即便 where 之后还有 rownum、order 等操作。支持使用上述有效值的组合值,如 6 表示同时进行 2 和 4 的优化。 | / |
ENABLE_HASH_JOIN | 是否允许使用哈希连接,0:不允许;1:允许。 | 尽可能使得执行计划只能选择走嵌套循环方式。 |
ENABLE_INDEX_JOIN | 是否允许使用索引连接,0:不允许;1:允许。 | 有些场景走索引连接反而效果更差,直接走 NEST LOOP INNER JOIN2,多见存在子查询场景。 |
3.2 参数修改方法
参数分为:静态、动态、手动。如下表所示:
参数 | 描述 |
---|---|
静态 | 可以被动态修改,需重启服务器生效。 |
动态 | 可以被动态修改,修改后即时生效;动态分为会话级和系统级;会话级:新参数值只影响新创建的会话,之前的会话不受影响;系统级:修改后会影响所有会话。 |
手动 | 不能动态修改,只能修改 dm.ini 然后重启。 |
3.2.1 调用系统过程
3.2.1.1 参数查询
- 查询数值类型参数值:
# 语法格式:
select SF_GET_PARA_VALUE (scope int, paraname varchar(256));
--SCOPE 参数为 1 表示获取 INI 文件中配置参数的值
--SCOPE 参数为 2 表示获取内存中配置参数的值# 例如:获取 DM.INI 文件中动态参数 HFS_CACHE_SIZE 的当前值
select SF_GET_PARA_VALUE (1,'HFS_CACHE_SIZE');
- 查询浮点型参数值:
# 语法格式
select SF_GET_PARA_DOUBLE_VALUE(scope int, paraname varchar(8187));
--SCOPE 参数为 1 表示获取 INI 文件中配置参数的值
--SCOPE 参数为 2 表示获取内存中配置参数的值# 例如:获取内存中 参数SEL_RATE_EQU 的当前值
select SF_GET_PARA_DOUBLE_VALUE(2,'SEL_RATE_EQU');
- 查询字符串类型参数值:
# 语法格式
select SF_GET_PARA_STRING_VALUE(scope int, paraname varchar(8187));
--SCOPE 参数为 1 表示获取 INI 文件中配置参数的值
--SCOPE 参数为 2 表示获取内存中配置参数的值# 例如:获取 DM.INI 文件中动态参数 SQL_TRACE_MASK 的当前值
select SF_GET_PARA_STRING_VALUE(1,'SQL_TRACE_MASK');
- 获得当前会话的某个会话级 INI 参数的值:
# 语法格式
select SF_GET_SESSION_PARA_VALUE (paraname varchar(8187));
# 例如:获取当前会话 USE_HAGR_FLA 参数的值
select SF_GET_SESSION_PARA_VALUE ('USE_HAGR_FLAG');
3.2.1.2 参数修改
- 修改整型静态配置参数和动态配置参数:
# 语法格式
SP_SET_PARA_VALUE (scope int, paraname varchar(256), value int64);
--SCOPE 参数为 1 表示在内存和 INI 文件中都修改参数值,此时只能修改动态的配置参数。当 SCOPE 等于 1,试图修改静态配置参数时服务器会返回错误信息
--SCOPE 参数为 2 表示只在 INI 文件中修改配置参数,此时可用来修改静态配置参数和动态配置参数# 例如:将 DM.INI 文件中动态参数 HFS_CACHE_SIZE 设置为 320,在 disql 中执行以下命令即可立即生效
SP_SET_PARA_VALUE (1,'HFS_CACHE_SIZE',320);
- 修改浮点型静态配置参数和动态配置参数:
# 语法格式
SP_SET_PARA_DOUBLE_VALUE(scope int,paraname varchar(8187),value double);
--SCOPE 参数为 1 表示在内存和 INI 文件中都修改参数值,此时只能修改动态的配置参数。当 SCOPE 等于 1,试图修改静态配置参数时服务器会返回错误信息
--SCOPE参数为 2 表示只在 INI 文件中修改配置参数,此时可用来修改静态配置参数和动态配置参数# 例如:将 DM.INI 文件中动态参数 SEL_RATE_EQU 设置为 0.3,在 disql 中执行以下命令即可立即生效
SP_SET_PARA_DOUBLE_VALUE(1, 'SEL_RATE_EQU', 0.3);
- 修改系统整型、double、 varchar 的静态配置参数或动态配置参数:
# 语法格式
SF_SET_SYSTEM_PARA_VALUE(paraname varchar(256),value int64\double\varchar(256),deferred int,scope int64);
--DEFERRED 参数为 0 表示当前 session 修改的参数立即生效,默认为 0
--DEFERRED 参数为 1 表示当前 session 不生效,后续再生效
--SCOPE 参数为 1 表示在内存和 INI 文件中都修改参数值,此时只能修改动态的配置参数
--SCOPE 参数为 2 表示只在 INI 文件中修改配置参数,此时可用来修改静态配置参数和动态配置参数# 例如:将动态参数 ENABLE_DDL_ANY_PRIV 设置为 1,且当前 session 立即生效
select SF_SET_SYSTEM_PARA_VALUE('ENABLE_DDL_ANY_PRIV',1,0,1);
- 修改某个会话级 INI 参数的值,设置的参数值只对本会话有效:
# 语法格式
SF_SET_SESSION_PARA_VALUE (paraname varchar(8187), value bigint);
# 例如:将 USE_HAGR_FLAG 设置为 1,且只对本会话有效
select SF_SET_SESSION_PARA_VALUE ('USE_HAGR_FLAG',1);
- 重置某个会话级 INI 参数的值,使得这个 INI 参数的值和系统 INI 参数的值保持一致:
# 语法格式
SP_RESET_SESSION_PARA_VALUE (paraname varchar(8187));
# 例如:重置 USE_HAGR_FLAG
select SP_RESET_SESSION_PARA_VALUE ('USE_HAGR_FLAG');
3.2.2 ALTER 命令修改
修改系统参数:
# 语法格式
ALTER SYSTEM SET ‘<参数名称>’ =<参数值> [DEFERRED] [MEMORY|BOTH|SPFILE];# 静态参数修改
ALTER SYSTEM SET ‘MTAB_MEM_SIZE’ =1200 spfile;
# PURGE关键字指是否清理执行计划
ALTER SESSION SET ‘<参数名称>’ =<参数值> [PURGE];
# 修改当前会话参数
ALTER SESSION SET ‘HAGR_HASH_SIZE’ =2000000;
3.2.3 修改 INI 文件
dm.ini 文件一般情况下位于数据库实例路径下,可以通过 vi dm.ini
命令修改。修改完成后,可以通过 v$dm_ini
或者 v$parameter
查询参数值。例如:
--查询v$dm_ini
select * from v$dm_ini where para_name LIKE 'PK_WITH%';
--查询v$parameter
select * from v$parameter where name LIKE 'PK_WITH%'
4 SQL优化
4.1 定位慢 SQL
定位执行效率低的 SQL 语句是 SQL 优化的第一步。待优化的 SQL 可大致分为两类:
SQL 执行时间在十几秒到数十秒之间,但执行频率不高,此类 SQL 对数据库整体性能影响并不大,可以放到最后进行优化。
SQL 单独执行时间可能很快,在几百毫秒到几秒之间,但执行频率非常高,甚至达到每秒上百次,高并发下执行效率降低,很可能导致系统瘫痪,此类 SQL 是优化的首要对象。
以下介绍两种定位慢 SQL 的方法,可记录下具体 SQL 语句以及对应执行时间,为后续 SQL 优化工作奠定基础:
4.1.1 开启跟踪日志记录
跟踪日志文件是一个纯文本文件,以”dmsql_实例名_日期_时间命名.log”,默认生成在 DM 安装目录的 log 子目录下。跟踪日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息、执行时间等。跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态进行分析。
4.1.1.1 跟踪日志记录配置
- 配置 dm.ini 文件,设置 SVR_LOG = 1 以启用 sqllog.ini 配置,该参数为动态参数,可通过调用数据库函数直接修改,如下所示:
SP_SET_PARA_VALUE(1,'SVR_LOG',1);
- 配置数据文件目录下的 sqllog.ini 文件:
[dmdba@localhost DAMENG]$ cat sqllog.ini
BUF_TOTAL_SIZE = 10240 #SQLs Log Buffer Total Size(K)(1024~1024000)
BUF_SIZE = 1024 #SQLs Log Buffer Size(K)(50~409600)
BUF_KEEP_CNT = 6 #SQLs Log buffer keeped count(1~100)[SLOG_ALL]FILE_PATH = ../logPART_STOR = 0SWITCH_MODE = 1SWITCH_LIMIT = 100000
# 为避免记录 SQL log 对服务器产生较大的影响,可以配置异步日志刷新(参数 ASYNC_FLUSH 设置为 1)。ASYNC_FLUSH = 0FILE_NUM = 200ITEMS = 0SQL_TRACE_MASK = 2:3:23:24:25MIN_EXEC_TIME = 0USER_MODE = 0USERS =
- 如果对 sqllog.ini 进行了修改,可通过调用以下函数即时生效,无需重启数据库,如下所示:
SP_REFRESH_SVR_LOG_CONFIG();
- 各配置项详细说明如下表4-1所示:
参数名 | 缺省值 | 说明 |
---|---|---|
SQL_TRACE_MASK | 1 | LOG 记录的语句类型掩码,是一个格式化的字符串,表示一个 32 位整数上哪一位将被置为 1,置为指定 SQL 日志中需要被记录的语句类型。指定方式为 SQL_TRACE_MASK=位号:位号:位号……。如:3:5:7 表示第 3、第 5、第 7 位号代表的类型需要被记录在 SQL 日志中。以下位号均可单独使用,也可以搭配使用,其中位号 2~17 与 23、24、25、26、28 搭配使用时,表示取其交集。 例如:SQL_TRACE_MASK=2 表示记录 DML 语句;SQL_TRACE_MASK=24 表示记录执行语句;SQL_TRACE_MASK=29 表示记录事务相关语句;SQL_TRACE_MASK=2:3:24:29 表示记录 DML 和 DDL 的执行语句以及事务相关语句。 位号的含义如下所示: 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 | 0 | 总共记录多少个日志文件,当日志文件达到这个设定值以后,再生成新的文件时,会删除最早的那个日志文件,日志文件的命令格式为 dmsql_实例名_日期时间.log。当这个参数配置成 0 时,只会生成两个日志相互切换着记录。有效值范围(0~1024)。例如,当 FILE_NUM=0,实例名为 PDM 时,根据当时的日期时间,生成的日志名称为:DMSQL_PDM_20180719_163701.LOG,DMSQL_PDM_20180719_163702.LOG |
SWITCH_MODE | 0 | 表示 SQL 日志文件切换的模式:0:不切换 1:按文件中记录数量切换 2:按文件大小切换 3:按时间间隔切换 |
SWITCH_LIMIT | 100000 | 不同切换模式 SWITCH_MODE 下,意义不同:按数量切换时,一个日志文件中的 SQL 记录条数达到多少条之后系统会自动将日志切换到另一个文件中。一个日志文件中的 SQL记录条数达到多少条之后系统会自动将日志切换到另一个文件中。有效值范围(1000-10000000)按文件大小切换时,一个日志文件达到该大小后,系统自动将日志切换到另一个文件中,单位为 MB。有效值范围(1-2000)按时间间隔切换时,每个指定的时间间隔,按文件新建时间进行文件切换,单位为分钟。有效值范围(1-30000)。 |
ASYNC_FLUSH | 0 | 是否打开异步 SQL 日志功能。0:表示关闭 1:表示打开 |
MIN_EXEC_TIME | 0 | 详细模式下,记录的最小语句执行时间,单位为毫秒。执行时间小于该值的语句不记录在日志文件中。有效值范围(0-4294967294)。 |
FILE_PATH | …/log | 日志文件所在的文件夹路径 |
BUF_TOTAL_SIZE | 10240 | SQL 日志 BUFFER 占用空间的上限,单位为 KB,取值范围(1024-1024000) |
BUF_SIZE | 1024 | 一块 SQL 日志 BUFFER 的空间大小,单位为 KB,取值范围(50-09600) |
BUF_KEEP_CNT | 6 | 系统保留的 SQL 日志缓存的个数, 有效值范围(1-100) |
PART_STOR | 0 | SQL 日志分区存储,表示 SQL 日志进行分区存储的划分条件。0 表示不划分; 1 表示 USER:根据不同用户分布存储 |
ITEMS | 0 | 配置 SQL 日志记录中的那些列要被记录。该参数是一个格式化的字符串,表示一个记录中的那些项目要被记录,格式为:列号:列号:列号。如:3:5:7 表示第 3,第 5,第 7 列要被记录。0 表示记录所有的列。 1 TIME 执行的时间 2 SEQNO 服务器的站点号 3 SESS 操作的 SESS 地址 4 USER 执行的用户 5 TRXID 事务 ID 6 STMT 语句地址 7 APPNAME 客户端工具 8 IP 客户端 IP9 STMT_TYPE 语句类型 10 INFO 记录内容 11 RESULT 运行结果,包括运行用时和影响行数(可能没有) |
USER_MODE | 0 | SQL 日志按用户过滤时的过滤模式,取值: 0:关闭用户过滤 1:白名单模式,只记录列出的用户操作的 SQL 日志 2:黑名单模式,列出的用户不记录 SQL 日志 |
USERS | 空串 | 打开 USER_MODE 时指定的用户列表。格式为:用户名:用户名:用户名 |
4.1.1.2 查询方法
sqllog.ini 文件配置成功后可在 dmsql 指定目录下生成 dmsql 开头的 log 日志文件。可以通过正则表达式在 dmsql 日志文件中查找执行时间超过一定阈值的 SQL 语句。例如:查找执行时间超过 10 秒的 SQL 语句:
[1-9][0-9][0-9][0-9][0-9](ms)
如需进行更为系统全面的分析,可使用 DMLOG 工具 进行分类汇总。
4.1.2 通过系统视图查看
DM 数据库提供系统动态视图,可自动记录执行时间超过设定阈值的 SQL 语句。
4.1.2.1 SQL 记录配置
当 INI 参数 ENABLE_MONITOR=1、MONITOR_TIME=1 打开时,显示系统最近 1000 条执行时间超过预定值的 SQL 语句,默认预定值为 1000 毫秒。
以上两个参数可通过 SP_SET_PARA_VALUE 系统函数修改,通过 SF_GET_PARA_VALUE 系统函数查看当前值。
--修改参数值
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);--查看参数值
select SF_GET_PARA_VALUE(1,'ENABLE_MONITOR');
select SF_GET_PARA_VALUE(1,'MONITOR_TIME');
需要注意的是:
- 两个参数均为动态参数,可直接调用系统函数进行修改,无须重启数据库实例服务;
- 通过 SP_SET_PARA_VALUE 方式修改的参数值仅对当前会话以及新建会话生效,对其它已建立会话不生效。
4.1.2.2 查询方式
- 查询当前正在执行的会话信息:
SELECT * FROM (
SELECT 'SP_CLOSE_SESSION('||SESS_ID||');' AS CLOSE_SESSION,DATEDIFF(SS,LAST_SEND_TIME,SYSDATE) sql_exectime,TRX_ID,CLNT_IP,B.IO_WAIT_TIME AS IO_WAIT_TIME,SF_GET_SESSION_SQL(SESS_ID) FULLSQL,A.SQL_TEXTFROM V$SESSIONS a,V$SQL_STAT B WHERE STATE IN ('ACTIVE','WAIT') AND A.SESS_ID = B.SESSID)
SQL_TEXT 列记录的是部分 SQL 语句;FULLSQL 列存储了完整的执行 SQL 语句。
- 查询超过执行时间阈值的 SQL 语句
可通过查询 V$LONG_EXEC_SQLS 系统视图获取结果:
SELECT * FROM V$LONG_EXEC_SQLS;
查询结果字段详细信息介绍如下表所示:
列名 | 说明 |
---|---|
SESS_ID | 会话 ID, 会话唯一标识 |
SQL_ID | 语句 ID, 语句唯一标识 |
SQL_TEXT | SQL 文本 |
EXEC_TIME | 执行时间(毫秒) |
FINISH_TIME | 执行结束时间 |
N_RUNS | 执行次数 |
SEQNO | 编号 |
TRX_ID | 事务号 |
社区地址:https://eco.dameng.com