达梦数据库的查询优化器依赖统计信息(如行数、列唯一值、直方图等)生成执行计划。同时,DBA 可通过 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
说明:dexp 默认导出表结构、数据、约束、索引、统计信息等所有内容。
dimp SYSDBA/'"Test@xxx123"'@192.168.3.250:5236 FILE=/dmdata/backup/table_full.dmp LOG=table_full.log FULL=Y
导入后,统计信息与源端一致
四、导出表结构 + 统计信息
适用于需要在新环境快速复刻表定义和优化器统计信息,但不想迁移实际数据行的场景(如测试环境复现生产执行计划)。
由于默认导出包含数据行,我们需要用 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
dimp SYSDBA/'"Test@xxx123"'@192.168.3.250:5236 FILE=/dmdata/backup/table_structure_stats.dmp LOG=imp_struct_stats.log FULL=Y
导入后,目标库中 EMPLOYEE 表为空表,但查询统计信息与源库一致
五、只导入导出统计信息
当目标库中表结构已经存在(例如已通过其他方式同步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
注意:这里 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
导入后,统计信息会覆盖目标库中现有的统计信息。
六、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
dimp SYSDBA/'"Test@xxx123"'@192.168.3.250:5236 FILE=/dmdata/backup/full_db_with_hint.dmp LOG=imp_hint.log FULL=Y
验证 HINT 规则是否导入成功
文章
阅读量
获赞
