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:表示语义分析阶段 |