为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8 非集群
【操作系统】:LINUX
【CPU】:
【问题描述】*:
(1)数据:2千万数据量,其中有三个单索引,VARCHAR类型【name】、Long类型【timestamp】、Varchar类型【parentId】,本次问题为【parentId】索引
(2)背景:生产环境线上运行一段时间后,会突然出现索引失效的情况,在此之前并无宕机、迁移、备份等操作;
(3)问题现象:同样sql使用IDEA连接达梦数据库,控制台查询约100ms;使用DM管理工具同样为100ms,但应用程序调用约30s
(4)sql:select * from myTable where parent_id in ('','',''),单条件查询,传入11个值,结果集约100条,示例parentId “12345-543-567-32”;
(5)实际应用代码 LambdaQueryWrapper.in(MyTble::getParentId,aList);
(6)并发情况:只有并发读,不存在并发改,凌晨会有批量插入和修改。白天查询频率较高,【name】和【parentId】频率基本一致,timestamp较少使用
(7)处理:先根据之前反馈得到的方案,更新统计信息(表、列、索引都有)后无任何变化,且共更新两次(中间间隔24小时),仍是直接查询走索引、程序调用不走索引;尝试更换传值,无变化;直接删除索引再用原句重建,有效
(8)疑问:为什么刷新统计信息不行,直接重建可以?底层具体是什么影响的?是否有其他处理方案?线上业务高峰时不可能直接删除索引,需要替代方案,因业务需求字段类型不能更改,索引数量不能减少,求各位大佬解答,谢谢!
1.要看看你jdbc驱动是不是版本太旧了,建议从数据库服务器安装包下面换一个。
2.这个SQL是否绑定变量了,看看传递的类型。和管理工具是否一样。
3.达梦的jdbc是可以打印日志的,客户端配置一下,看看时间花在那块了
1、配置下数据库SQL日志记录,确认传的参数类型是否与实际一致,避免隐形转换导致不走索引。
参考文件,
https://eco.dameng.com/document/dm/zh-cn/ops/installation-install.html#2.3%20%E9%85%8D%E7%BD%AE%20SQL%20%E6%97%A5%E5%BF%97
2、更换驱动,使用数据库自带的对应版本驱动进行测试。
3、安装个新版本的测试库,将表、数据导过去测测是不是版本问题。
可能计划缓存的原因,参考清理缓存计划函数
清理所有计划缓存:
SP_CLEAR_PLAN_CACHE();
清理指定计划缓存:
SELECT CACHE_ITEM FROM V$CACHEPLN WHERE SQLSTR LIKE '%sql文本%';
SP_CLEAR_PLAN_CACHE(CACHE_ITEM);