首页 > 其他分享 >达梦优化记录

达梦优化记录

时间:2025-01-13 09:25:01浏览次数:1  
标签:EM ename dbms dm 记录 random em 优化 达梦

项目中碰到一个问题,一个简单的接口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  

标签:EM,ename,dbms,dm,记录,random,em,优化,达梦
From: https://www.cnblogs.com/fangzpa/p/18612527

相关文章