为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: 数据库1:DM Database Server 64 V8, 数据库2:DM Database Server 64 V8
【操作系统】:数据库1:UnionTech OS Desktop 20 Pro, 数据库2:银河麒麟 v10 sp1
【CPU】: 数据库1:兆芯开先KX-U6780A, 数据库2:HUAWEI Kunpeng920
【问题描述】*:同样的sql,在2个数据库中执行结果不一样,执行计划也不一样。2个数据库是一样的数据,是通过dm数据迁移工具从其中一个库迁移出来的。
业务需求:有一组数据,大概50万的地理点位信息,使用dm_geom包,使用了空间索引进行空间范围查询
查询sql:
SELECT outlet_info.id,
outlet_info.uid as outletUid,
outlet_info.lon,
outlet_info.lat,
outlet_info.sh_lon shLon,
outlet_info.sh_lat shLat,
outlet_info.flag_outlet flagOutlet,
outlet_info.un_outlet_type as unOutletType,
outlet_info.INVESTIGATE_STATUS investigateStatus,
outlet_info.TRACEABILITY_STATUS traceabilityStatus,
outlet_info.RENOVATION_STATUS renovationStatus,
OUTLET_TRACEABILITY_INFO.OUTLET_MAX_TYPE outletMaxType
from outlet_info
left join region_info
on region_info.region_code = outlet_info.region_code
left join OUTLET_TRACEABILITY_INFO
on OUTLET_TRACEABILITY_INFO.OUTLET_UID = outlet_info.uid
where dmgeo.st_contains(dmgeo.ST_GeomFromText('xxxxxxxx', 4326), OUTLET_INFO.GEOM)
and outlet_info.flag_del = 0
问题描述:
检查创建的索引是否正确和一致,从执行计划看 一个走了空间索引、一个走了普通索引。
如果索引一致,更新表和索引的统计信息。
1、达梦CBO优化器是以最低成本作为执行计划,表(列)统计信息对成本的计算有很大影响,因此,但凡迁移数据以及批量更新数据应该对表(列)统计信息进行重新收集;
2、您2个库数据相同(如果迁移正常)但计划不同(走不同的索引),原因是库2“发现”走索引count_outlet检索的成本是17比库1走索引OUTLET_INFO_GEOM_INDEX成本108更低,这种情况(数据库版本一致的前提下)很有可能是flag_del列统计信息在其中一个库缺失或者失准导致,可以执行dbms_stats.column_stats_show(user,'OUTLET_INFO','FLAG_DEL')查看统计信息,并比对通过sql查到的真实的列数据分布情况确认select FLAG_DEL,count(*) from OUTLET_INFO group by FLAG_DEL;
3、如果统计信息和同真实数据分布差距很大,应重新收集列统计信息,如:stat 100 on OUTLET_INFO(FLAG_DEL);然后优化器可根据相对“准确”的统计信息计算出最佳计划;
4、在开启计划缓存的情况下(多数会开),要使得优化器更新SQL的执行计划,可以通过sp_clear_plan_cache(<cache_item>),请参考https://eco.dameng.com/document/dm/zh-cn/faq/faq-optimizing,将旧的执行计划清理,再次执行时优化器会基于现有统计信息重新生成执行计划
迁移后,核对下表结构及表全部索引等信息,保持一致。 然后更新下库2的全库或模式的统计信息看看。