为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8.1 企业版
【操作系统】:统信UOS
【CPU】:
【问题描述】*:in 数量超过4个,查询非常慢。
总数据量
explain
select id from "TZ_BOOT".event_file where tuid in ('20260101095756770', '20260101140358377', '20260110093716106', '20260110104517285', '20260110150319509');
执行计划:
1 #NSET2: [1605, 983399, 156]
2 #PRJT2: [1605, 983399, 156]; exp_num(2), is_atom(FALSE)
3 #HASH2 INNER JOIN: [1605, 983399, 156]; KEY_NUM(1); KEY(DMTEMPVIEW_897015029.colname=EVENT_FILE.TUID) KEY_NULL_EQU(0)
4 #CONST VALUE LIST: [1, 5, 48]; row_num(5), col_num(1)
5 #CSCN2: [999, 7867198, 108]; INDEX33555915(EVENT_FILE); btr_scan(1)
explain
select id from "TZ_BOOT".event_file where tuid in ('20260101095756770', '20260101140358377', '20260110093716106', '20260110104517285');
执行计划:
1 #NSET2: [866, 786719, 108]
2 #PRJT2: [866, 786719, 108]; exp_num(2), is_atom(FALSE)
3 #NEST LOOP INDEX JOIN2: [866, 786719, 108]
4 #CONST VALUE LIST: [1, 4, 48]; row_num(4), col_num(1)
5 #BLKUP2: [866, 196679, 108]; idx_tuid(EVENT_FILE)
6 #SSEK2: [866, 196679, 108]; scan_type(ASC), idx_tuid(EVENT_FILE), scan_range[DMTEMPVIEW_897015032.colname,DMTEMPVIEW_897015032.colname], is_global(0)
我后端服务统一用的Mybatis plus ,不希望有太多sql编写,能不能在数据库层面解决这个问题。
explain
select id from "TZ_BOOT".event_file where tuid in ('20260101095756770', '20260101140358377', '20260110093716106', '20260110104517285');
执行计划:
1 #NSET2: [866, 786719, 108]
2 #PRJT2: [866, 786719, 108]; exp_num(2), is_atom(FALSE)
3 #NEST LOOP INDEX JOIN2: [866, 786719, 108]
4 #CONST VALUE LIST: [1, 4, 48]; row_num(4), col_num(1)
5 #BLKUP2: [866, 196679, 108]; idx_tuid(EVENT_FILE)
6 #SSEK2: [866, 196679, 108]; scan_type(ASC), idx_tuid(EVENT_FILE),
--1、
你这个索引idx_tuid(EVENT_FILE)调整下,执行计划5和6走得是ssek2+blkup2,这是典型的SSEK2(二级索引扫描)+BLKUP2 优化成 SSEK
idx_tuid(EVENT_FILE)调整成联合索引,CREATE INDEX "idx_tuid_id" ON "TZ_BOOT"."event_file" ("tuid", "id");
--2、第一步调整后看看执行计划变了没,没变的话更新下统计信息,然后测试sql执行有没有快;

select 后面 添加 /+ENABLE_IN_VALUE_LIST_OPT(0)/这个hint试下