达梦优化记录
项目中碰到一个问题,一个简单的接口sql,关联字段都有索引,执行时间需要2s多,由于是一个接口sql,每次页面跳转都需要调用该sql,导致每次跳转不顺畅,先模拟相关测试
创建测试表
drop table if exists dm;
create table dm (did int primary key identity(2,3),ename varchar(200),deptno int);
declare i int;
begin
for i in 1..50000 loop
insert into dm (ename,deptno)
select dbms_random.string('2',trunc(dbms_random.value(2,4))),
trunc(dbms_random.value(1,6)) from dual;
end loop;
end;
drop table if exists em;
create table em (eid int primary key identity(1,1),ename varchar(200),age int,hiredate date,deptno int);
declare i int;
begin
for i in 1..5000000 loop
insert into em (ename,age,hiredate,deptno)
select dbms_random.string('2',trunc(dbms_random.value(2,4))),
trunc(dbms_random.value(1,100)),
ADD_DAYS(sysdate(),dbms_random.value(-10000,-10)),
trunc(dbms_random.value(1,6)) from dual;
end loop;
end;
创建索引
CREATE index idx_em_ename on em(ename);
create index idx_dm_ename on dm(ename);
收集统计信息
DBMS_STATS.GATHER_TABLE_STATS('SYSDBA','DM',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
DBMS_STATS.GATHER_TABLE_STATS('SYSDBA','EM',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
em表部分数据如下:
执行如下sql,一个简单的查询如下1.26s
SELECT EM.* FROM em JOIN dm ON EM.ename=dm.ename AND
((EM.EID=3 AND EM.age=67) OR (EM.EID=5 AND EM.age=20))

看et,慢在执行计划第七步全表扫描

执行计划如下

单独查询是走索引的,为什么放到表关联就没法走索引,同样的数据进行测试,oracle和mysql都走索引,到了达梦走了全表扫描。

通过enable_hash_join(0)让走索引,执行一分钟也不出结果,执行计划如下![]()


执行计划有CONST VALUE LIST,系统自动创建的一个常量列用于与实体表做连接。达梦对(EM.EID=3 AND EM.age=67) OR (EM.EID=5 AND EM.age=20)进行了优化,通过调整enable_in_value_list_opt为0消除CONST VALUE LIST、执行时间减少到0.048s

DM还是全表扫描,可以通过enable_hash_join(0) 让执行计划走索引,执行时间减少到0.001s

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
2023-01-13 记达梦日常使用中问题