注册
DCP培训数据库性能优化学习心得
培训园地/ 文章详情 /

DCP培训数据库性能优化学习心得

廖能伟 2025/08/06 34 0 0

一、 架构与设计优化
合理的表结构设计:

选择恰当的数据类型: 使用最精确、最小的数据类型(如能用INT就不用BIGINT,能用VARCHAR(20)就不用VARCHAR(255))。减少存储空间,提升I/O效率。

规范命名与注释: 提高可读性和维护性,间接利于优化分析。

谨慎使用大对象(LOB): TEXT, BLOB, CLOB等类型操作代价高。尽量避免在频繁查询的表中使用,或考虑单独存储。

范式与反范式平衡: 在满足数据一致性的前提下,适当冗余高频访问的非关键字段,避免过多表连接。分析查询模式是关键。

高效利用索引:索引是查询的加速器

为高频查询条件创建索引: WHERE, JOIN ON, ORDER BY, GROUP BY子句中的列是重点。

选择索引类型:

B树索引: 最常用,适合等值查询、范围查询、排序。达梦默认创建B树索引。

位图索引: 适用于低基数(唯一值少)的列,在数据仓库场景的复杂查询(多AND条件)中效率极高。

函数索引: 对列应用函数后的结果建立索引(如 UPPER(customer_name)),解决函数导致索引失效的问题。

全文索引: 用于高效的文本内容搜索 (CONTAINS)。

组合索引与列顺序: 将经常一起出现在查询条件中的列创建组合索引。将区分度高(唯一值多)的列放在组合索引左侧。避免创建过多冗余索引,影响DML性能。

监控索引使用率: 使用达梦性能监控工具或V$SQL_PLAN, V$OBJECT_USAGE等动态视图,找出从未使用或低效的索引并删除。

分区表策略:

应用场景: 处理海量数据表(如日志表、历史交易表)。

优势:

分区裁剪: 查询时只扫描相关分区,极大减少I/O。

并行操作: 维护操作(备份、重建索引、数据加载)可在分区级别并行。

管理便捷: 可单独对旧分区进行归档或删除。

分区类型选择: 根据业务特点选择范围分区(RANGE)、列表分区(LIST)、哈希分区(HASH)、间隔分区(INTERVAL)等。时间范围分区是最常见的场景。

物化视图:空间换时间

将复杂查询(尤其是包含多表连接和聚合)的结果预先计算并存储下来。

适用于报表、BI等对实时性要求不高的查询场景,能极大提升查询速度。

需权衡存储空间消耗和刷新策略(完全刷新/快速刷新/按需刷新)的开销。

读写分离:分担压力

利用达梦的数据守护(DM Data Watch)或DMDSC集群,配置主库负责写操作,多个备库负责读操作。

有效分担主库压力,提升整体读吞吐量。需注意应用层路由和数据同步延迟问题。

二、 SQL 语句优化:
理解执行计划:

使用 EXPLAIN/EXPLAIN FOR: 这是优化的起点!务必在修改重要SQL前查看其执行计划。达梦提供了多种格式(文本、JSON、树形图)。

关键关注点:

访问路径: 是全表扫描(FULL SCAN)还是索引扫描(INDEX SCAN)? 索引是否被有效利用?

连接方式: 是嵌套循环(NESTED LOOPS)、哈希连接(HASH JOIN)还是归并连接(MERGE JOIN)? 哪种更适合当前数据量?

估算行数(CARD): 优化器估算的行数是否准确?统计信息是否过期?

排序(SORT)和聚合(HASH GROUP BY/SORT GROUP BY)开销: 是否在内存中完成?是否产生临时文件?

代价(COST): 优化器估算的总执行代价,用于比较不同执行计划。

避免全表扫描:

确保查询条件列上有合适的索引。

避免在索引列上使用函数或进行运算(除非使用函数索引)。

优化连接查询:

驱动表选择: 通常将数据量小、过滤条件强的表作为驱动表(嵌套循环连接中放在外层)。

确保连接条件列有索引。

明确指定连接条件,避免笛卡尔积。

考虑 EXISTS 代替 IN (当子查询结果集大时 EXISTS 可能更优,结果集小时 IN 可能更优,需测试)。

减少数据访问量:

只选择需要的列: 避免 SELECT *,明确列出所需字段。

使用 TOP/LIMIT/ROWNUM: 分页查询或只需少量结果时使用。

利用 WHERE 子句精确过滤。

批处理DML: 大量 INSERT/UPDATE/DELETE 时,使用绑定变量和批处理接口,减少网络交互和SQL解析开销。

优化排序与分组:

确保 ORDER BY/GROUP BY 子句中的列有索引。

考虑利用索引的有序性避免额外的排序操作。

调整 SORT_BUFFER_SIZE 等内存参数,让排序尽量在内存中完成。

善用绑定变量:

避免SQL硬解析开销,提高系统处理能力,防止SQL注入。

在应用程序中使用占位符(?)或命名绑定变量。

三、 内存与参数优化:精调数据库引擎
关键内存池调整 (dm.ini):

MEMORY_POOL / BUFFER_POOL:数据缓冲区。存放从数据文件读取的数据块。这是最核心的内存区。根据物理内存合理设置(通常占可用内存的 50%-70%),过小会导致频繁物理读,过大会导致操作系统内存紧张。

MAX_SESSIONS / SESSION_MEMORY:控制会话数量和每个会话可用的私有内存(用于排序、哈希连接等)。需要平衡并发能力和内存消耗。

SORT_BUF_SIZE / HJ_BUF_SIZE:分别控制排序操作和哈希连接操作可使用的内存大小。对于涉及大量排序或哈希的复杂查询,适当增大这些值能显著提升性能。

CACHE_POOL_SIZE:SQL缓冲区/执行计划缓存。缓存SQL语句及其执行计划,避免重复硬解析。适当增大可提高高并发重复SQL的执行效率。

I/O 相关参数:

确保数据文件、日志文件、临时文件分布在不同的物理磁盘上,减少I/O竞争。

调整 DISK_IO_THREADS:增加异步I/O线程数,提升I/O并行度(尤其在高速SSD环境下)。

并发控制:

MAX_SESSIONS:限制最大并发连接数,防止系统过载。

WORKER_THREADS:工作线程池大小,影响并行查询和后台任务处理能力。根据CPU核心数调整(通常设置为 CPU核心数 * 2 左右)。

其他重要参数:

OPTIMIZER_MODE:优化器模式(如 RULE_BASED, COST_BASED, CHOOSE)。强烈建议使用基于成本的优化器(COST_BASED)。

PARALLEL_POLICY / PARALLEL_THRD_NUM:并行查询策略和最大并行线程数。对大型分析查询有效。

UNDO_RETENTION:控制已提交事务的撤销信息保留时间,影响闪回查询和长查询的读一致性。根据业务需要设置。

ARCH_INI:归档相关配置,确保归档及时有效,对数据保护和恢复至关重要。

ENABLE_MONITOR / MONITOR_TIME:开启SQL监视器,捕获执行时间过长的SQL。

重要提示:

修改参数前务必备份 dm.ini 文件!

一次只修改一个参数! 修改后观察系统表现。

在测试环境充分验证! 切勿直接在生产环境调优。

达梦提供 SP_SET_PARA_VALUE()/SP_SET_PARA_DOUBLE_VALUE() 过程动态修改部分参数,ALTER SYSTEM 修改静态参数(需重启生效)。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服