达梦优化记录

项目中碰到一个问题,一个简单的接口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
 
posted @   fangzpa  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
历史上的今天:
2023-01-13 记达梦日常使用中问题
点击右上角即可分享
微信分享提示