为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:windows
【CPU】:
【问题描述】*:insert INTO TPMIS95_JAVA_HQZZB.GZLMB select * from TPMIS95_JAVAQY.GZLMB
where TPMIS95_JAVAQY.GZLMB.gzlid in ('LS_JGLYXF_HQZZB','LS_JGJZGBXF_HQZZB','LS_JGFYXF_HQZZB',
'LS_JGDRXF_HQZZB','LS_JGWQDRXF_HQZZB','LS_JGXTWDRXF_HQZZB','LS_QNDD_HQZZB','LS_JGDWWQ_HQZZB')
插入特别慢怎么解决
这个原因有很多:
1、先单独执行select查询,看下执行计划以及执行时间,排查下性能瓶颈是不是卡在select,解决方法添加索引,增加select查询效率;
2、执行insert的表TPMIS95_JAVA_HQZZB.GZLMB,是否在插入时,同时存在其他业务比如delete和update等操作,导致锁竞争和阻塞,如果存在,在对应表没有业务的时候再执行,避免出现阻塞影响执行效率;
3、TPMIS95_JAVA_HQZZB.GZLMB查看这个张表上有多少索引,如果索引太多会影响到插入性能,可以先将表上的索引先禁用,等insert插入完成后再启用索引,加快insert效率,建议业务低峰期执行;
4、执行insert的时候查看,数据库服务器后台磁盘读写,看看磁盘是否写满,是否存在验证的io性能瓶颈,如果存在,想要加快只能更换io更快的磁盘;建议使用dd命令测试下磁盘读写,越快越好;
INSERT INTO ... SELECT * FROM ... WHERE ... IN (...) 语句插入特别慢,通常是由于未使用批量插入优化、目标表索引过多、统计信息不准确或大量回表操作所致。
-- 当插入行数大于等于该值时,启用批量插入
SP_SET_PARA_VALUE(1,'BATCH_INSERT_ROWS',10);
-- 插入前
ALTER INDEX <索引名> UNUSABLE;
-- 插入后
ALTER INDEX <索引名> REBUILD;
3.更新统计信息
-- 收集源表和目标表的统计信息
DBMS_STATS.GATHER_TABLE_STATS('TPMIS95_JAVAQY','GZLMB',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
DBMS_STATS.GATHER_TABLE_STATS('TPMIS95_JAVA_HQZZB','GZLMB',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
4.优化检查项:排除隐式转换与回表问题(使用EXPLAIN查看执行计划,确认源表扫描方式和目标表插入方式)
检查数据类型:确保gzlid字段在源表与目标表中的数据类型完全一致。如果不一致,会导致隐式转换,使得WHERE IN条件无法使用索引。
检查执行计划中的回表:如果源表GZLMB的gzlid列有索引,但SELECT *需要回表,可以考虑创建覆盖索引.

单独执行select效率如何呢?select 查询出来的数据量是多大?