注册
dimp/dexp导入导出统计信息与HINT
技术分享/ 文章详情 /

dimp/dexp导入导出统计信息与HINT

DM_020153 2026/05/14 124 0 0

一、 背景

达梦数据库的查询优化器依赖统计信息(如行数、列唯一值、直方图等)生成执行计划。同时,DBA 可通过 HINT 手动干预执行计划。
在实际运维中,经常需要将统计信息和 HINT 从一个环境迁移到另一个环境(如生产→测试),以便:

  • 测试环境复现生产执行计划,避免因统计信息差异导致性能失真;
  • 保留人工调优的 HINT 成果;
  • 减少大版本升级后重新收集统计信息的耗时。

二、测试准备:创建测试表和收集统计信息

在开始导出前,先在达梦数据库中创建测试数据
– 创建测试模式

SET SCHEMA TEST_STAT;

-- 创建员工表
CREATE TABLE TEST_STAT.EMPLOYEE (
    EMP_ID INT PRIMARY KEY,
    EMP_NAME VARCHAR(50),
    DEPT_ID INT,
    SALARY DECIMAL(10,2),
    HIRE_DATE DATE
);

-- 创建部门表
CREATE TABLE TEST_STAT.DEPARTMENT (
    DEPT_ID INT PRIMARY KEY,
    DEPT_NAME VARCHAR(50),
    MANAGER_ID INT
);

-- 插入测试数据(员工表10000行,部门表20行)
INSERT INTO TEST_STAT.EMPLOYEE 
SELECT LEVEL, 'EMP_' || LEVEL, MOD(LEVEL, 20) + 1,
       ROUND(DBMS_RANDOM.VALUE(3000, 50000), 2),
       SYSDATE - MOD(LEVEL, 1000)
FROM DUAL CONNECT BY LEVEL <= 10000;

INSERT INTO TEST_STAT.DEPARTMENT
SELECT LEVEL, 'DEPT_' || LEVEL, MOD(LEVEL, 100) + 1
FROM DUAL CONNECT BY LEVEL <= 20;

COMMIT;

-- 创建索引
CREATE INDEX IDX_EMP_DEPT ON TEST_STAT.EMPLOYEE(DEPT_ID);
CREATE INDEX IDX_EMP_HIRE_DATE ON TEST_STAT.EMPLOYEE(HIRE_DATE);

-- 收集统计信息
CALL DBMS_STATS.GATHER_SCHEMA_STATS('TEST_STAT', 100, TRUE, 'FOR ALL COLUMNS SIZE AUTO');
验证统计信息:
SELECT c.name AS schema_name,
       b.name AS table_name,
       (SELECT name FROM SYS.SYSCOLUMNS WHERE colid = a.colid AND id = a.id) AS column_name,
       a.T_FLAG,
       a.blevel,
       a.n_leaf_pages,
       a.n_leaf_used_pages,
       a.N_DISTINCT,
       a.N_NULL,
       a.LAST_GATHERED
FROM sysstats a
LEFT JOIN sysobjects b ON a.id = b.id
LEFT JOIN sysobjects c ON b.schid = c.id
WHERE c.name = 'TEST_STAT' 
  AND b.name = 'EMPLOYEE';      
 
-- 注入hint
SF_INJECT_HINT(
    sql_text => 'SELECT * FROM TEST_STAT.EMPLOYEE WHERE HIRE_DATE = SYSDATE - 10;',
    hint_text => 'INDEX(EMPLOYEE, IDX_EMP_HIRE_DATE)',
    name => 'FORCE_HIRE_DATE_INDEX',
    description => '强制使用雇佣日期索引',
    validate => TRUE,
    fuzzy => FALSE
);

-- 检查hint
select * from sysinjecthint;

三、导出完整的一个表(表结构+数据+统计信息+HINT)
这是最常规的全量导出,默认包含所有内容。以 EMPLOYEE 表为例:

dexp SYSDBA/'"Test@xxx123"'@localhost:5236 DIRECTORY=/dmdata/backup FILE=table_full.dmp LOG=exp_table_full.log TABLES=TEST_STAT.EMPLOYEE

image.png

说明:dexp 默认导出表结构、数据、约束、索引、统计信息等所有内容。

dimp SYSDBA/'"Test@xxx123"'@192.168.3.250:5236 FILE=/dmdata/backup/table_full.dmp LOG=table_full.log FULL=Y  

image.png

导入后,统计信息与源端一致
image.png

四、导出表结构 + 统计信息
适用于需要在新环境快速复刻表定义和优化器统计信息,但不想迁移实际数据行的场景(如测试环境复现生产执行计划)。
由于默认导出包含数据行,我们需要用 EXCLUDE指定不包含 ROWS 即可。

dexp SYSDBA/'"Test@xxx123"'@localhost:5236 DIRECTORY=/dmdata/backup FILE=table_structure_stats.dmp LOG=exp_struct_stats.log TABLES=TEST_STAT.EMPLOYEE EXCLUDE=ROWS

image.png

dimp SYSDBA/'"Test@xxx123"'@192.168.3.250:5236 FILE=/dmdata/backup/table_structure_stats.dmp LOG=imp_struct_stats.log FULL=Y

image.png

导入后,目标库中 EMPLOYEE 表为空表,但查询统计信息与源库一致
image.png

五、只导入导出统计信息
当目标库中表结构已经存在(例如已通过其他方式同步DDL),只需要迁移统计信息时,可指定INCLUDE=STATISTICS。导出的文件极小。

dexp SYSDBA/'"Test@xxx123"'@localhost:5236 DIRECTORY=/dmdata/backup FILE=only_stats.dmp LOG=exp_only_stats.log SCHEMAS=TEST_STAT INCLUDE=STATISTICS

image.png

注意:这里 INCLUDE 只写了 STATISTICS ,因此导出的文件中不包含表结构定义。
导入前要求:目标库中 TEST_STAT 模式下的 EMPLOYEE 和 DEPARTMENT 表必须已经存在(可以只有空表结构)。

dimp SYSDBA/'"Test@xxx123"'@192.168.3.250:5236 FILE=/dmdata/backup/only_stats.dmp LOG=imp_only_stats.log FULL=Y

image.png
导入后,统计信息会覆盖目标库中现有的统计信息。
image.png

六、HINT导出导入
Hint导入导出要在全库级别FULL=Y

dexp SYSDBA/'"Test@xxx123"'@localhost:5236 DIRECTORY=/dmdata/backup FILE=full_db_with_hint.dmp LOG=exp_full.log FULL=Y INCLUDE=HINT

image.png

dimp SYSDBA/'"Test@xxx123"'@192.168.3.250:5236 FILE=/dmdata/backup/full_db_with_hint.dmp LOG=imp_hint.log FULL=Y

image.png
验证 HINT 规则是否导入成功
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服