为了更快的定位您的问题,请提供以下信息,谢谢
【详述】一个大的select查询 left join 一个小的select查询(一般是维度表),执行explain 生成查询计划,就报 java.lang.IllegalArgumentException: Multiple entries with same key: java.nio.HeapByteBuffer[pos=4602 lim=4659 cap=5851]=165 and java.nio.HeapByteBuffer[pos=3549 lim=3606 cap=3732]=78
【背景】执行 explain 一个大的select查询 left join 一个小的select查询,报错
【业务影响】刚从tidb迁移到starrocks,发现部分sql语句无法执行,报如上错误
【是否存算分离】是
【StarRocks版本】4.0.8
【集群规模】例如:3fe+1be(
【机器信息】fe:16C/32G cn:16C/64G
【联系方式】78347793@qq.com
【附件】
2026-05-24 16:08:29.259+08:00 WARN (starrocks-mysql-nio-pool-951|12126) [StmtExecutor.execute():1066] execute Exception, sql: {}, explain SELECT
table_220411491.主键 AS 主键,
table_220411491.保险公司 AS 保险公司,
table_220411491.公司 AS 公司,
table_220411491.车架号 AS 车架号,
table_220411491.车型 AS 车型,
table_220411491.车款 AS 车款,
table_220411491.NCD系数 AS NCD系数,
table_220411491.自主定价系数 AS 自主定价系数,
table_220411491.版本类型 AS 版本类型,
table_220411491.保单号 AS 保单号,
table_220411491.车损险的绝对免赔额元 AS 车损险的绝对免赔额元,
table_220411491.车损险的保单金额元 AS 车损险的保单金额元,
table_220411491.三者保额万元 AS 三者保额万元,
table_220411491.三者保费元 AS 三者保费元,
table_220411491.车上人员责任保险驾驶人保额万元 AS 车上人员责任保险驾驶人保额万元,
table_220411491.车上人员责任保险驾驶人保费 AS 车上人员责任保险驾驶人保费,
table_220411491.车上人员责任保险乘客保额万元 AS 车上人员责任保险乘客保额万元,
table_220411491.车上人员责任保险乘客保费 AS 车上人员责任保险乘客保费,
table_220411491.保单对应的最初版本商业险总额 AS 保单对应的最初版本商业险总额,
table_220411491.保单生效日期 AS 保单生效日期,
table_220411491.保单结束日期 AS 保单结束日期,
table_220411491.运营性质 AS 运营性质,
table_220411491.上个版本公司 AS 上个版本公司,
table_220411491.上个版本车架号 AS 上个版本车架号,
table_220411491.上个版本NCD系数 AS 上个版本NCD系数,
table_220411491.上个版本自主定价系数 AS 上个版本自主定价系数,
table_220411491.上个版本保单号 AS 上个版本保单号,
table_220411491.上个版本开始日期 AS 上个版本开始日期,
table_220411491.上个版本终止日期 AS 上个版本终止日期,
table_220411491.上个版本运营性质 AS 上个版本运营性质,
table_220411491.上个版本车损险的绝对免赔额元 AS 上个版本车损险的绝对免赔额元,
table_220411491.上个版本车损险的保单金额元 AS 上个版本车损险的保单金额元,
table_220411491.上个版本三者保额万元 AS 上个版本三者保额万元,
table_220411491.上个版本三者保费元 AS 上个版本三者保费元,
table_220411491.上个版本保单对应的最初版本商业险总额 AS 上个版本保单对应的最初版本商业险总额,
table_220411491.保险终止日期 AS 保险终止日期,
table_220411491.26年自主定价系数 AS 26年自主定价系数,
table_220411491.25年自主定价系数 AS 25年自主定价系数,
table_220411491.26年NCD系数 AS 26年NCD系数,
table_220411491.25年NCD系数 AS 25年NCD系数,
table_220411491.25年投保性质 AS 25年投保性质,
table_220411491.26年投保性质 AS 26年投保性质,
table_1585765900.公司 AS 公司_1,
table_1585765900.区域 AS 区域,
table_1585765900.公司城市 AS 公司城市,
table_1585765900.省 AS 省,
table_1585765900.市 AS 市,
table_1585765900.经度 AS 经度,
table_1585765900.纬度 AS 纬度
FROM (
SELECT
table_220411491.主键 AS 主键,
table_220411491.保险公司 AS 保险公司,
table_220411491.公司 AS 公司,
table_220411491.车架号 AS 车架号,
table_220411491.车型 AS 车型,
table_220411491.车款 AS 车款,
table_220411491.NCD系数 AS NCD系数,
table_220411491.自主定价系数 AS 自主定价系数,
table_220411491.版本类型 AS 版本类型,
table_220411491.保单号 AS 保单号,
table_220411491.车损险的绝对免赔额元 AS 车损险的绝对免赔额元,
table_220411491.车损险的保单金额元 AS 车损险的保单金额元,
table_220411491.三者保额万元 AS 三者保额万元,
table_220411491.三者保费元 AS 三者保费元,
table_220411491.车上人员责任保险驾驶人保额万元 AS 车上人员责任保险驾驶人保额万元,
table_220411491.车上人员责任保险驾驶人保费 AS 车上人员责任保险驾驶人保费,
table_220411491.车上人员责任保险乘客保额万元 AS 车上人员责任保险乘客保额万元,
table_220411491.车上人员责任保险乘客保费 AS 车上人员责任保险乘客保费,
table_220411491.保单对应的最初版本商业险总额 AS 保单对应的最初版本商业险总额,
table_220411491.保单生效日期 AS 保单生效日期,
table_220411491.保单结束日期 AS 保单结束日期,
table_220411491.运营性质 AS 运营性质,
table_220411491.上个版本公司 AS 上个版本公司,
table_220411491.上个版本车架号 AS 上个版本车架号,
table_220411491.上个版本NCD系数 AS 上个版本NCD系数,
table_220411491.上个版本自主定价系数 AS 上个版本自主定价系数,
table_220411491.上个版本保单号 AS 上个版本保单号,
table_220411491.上个版本开始日期 AS 上个版本开始日期,
table_220411491.上个版本终止日期 AS 上个版本终止日期,
table_220411491.上个版本运营性质 AS 上个版本运营性质,
table_220411491.上个版本车损险的绝对免赔额元 AS 上个版本车损险的绝对免赔额元,
table_220411491.上个版本车损险的保单金额元 AS 上个版本车损险的保单金额元,
table_220411491.上个版本三者保额万元 AS 上个版本三者保额万元,
table_220411491.上个版本三者保费元 AS 上个版本三者保费元,
table_220411491.上个版本保单对应的最初版本商业险总额 AS 上个版本保单对应的最初版本商业险总额,
table_220411491.保险终止日期 AS 保险终止日期,
table_220411491.26年自主定价系数 AS 26年自主定价系数,
table_220411491.25年自主定价系数 AS 25年自主定价系数,
table_220411491.26年NCD系数 AS 26年NCD系数,
table_220411491.25年NCD系数 AS 25年NCD系数,
table_220411491.25年投保性质 AS 25年投保性质,
table_220411491.26年投保性质 AS 26年投保性质
FROM (
SELECT DISTINCT
t3.id AS 主键,
t3.insCompanyName AS 保险公司,
t3.company_name AS 公司,
t3.vehicle_vin AS 车架号,
t3.model_name AS 车型,
t3.style_name AS 车款,
t3.ncd_radio AS NCD系数,
t3.self_pricing_coefficient AS 自主定价系数,
t3.insure_type AS 版本类型,
t3.insure_number AS 保单号,
t3.deductible AS 车损险的绝对免赔额元,
t3.payable_amount AS 车损险的保单金额元,
t3.insure_value_money AS 三者保额万元,
t3.payable_amount1 AS 三者保费元,
t3.insure_value_money9 AS 车上人员责任保险驾驶人保额万元,
t3.payable_amount9 AS 车上人员责任保险驾驶人保费,
t3.insure_value_money10 AS 车上人员责任保险乘客保额万元,
t3.payable_amount10 AS 车上人员责任保险乘客保费,
t3.payable_sum AS 保单对应的最初版本商业险总额,
t3.take_effect_date AS 保单生效日期,
t3.ins_next_date_1 AS 保单结束日期,
CASE
WHEN t3.use_nature = 1 THEN ‘运营’
WHEN t3.use_nature = 2 THEN ‘非运营’
END AS 运营性质,
bb.company_name AS 上个版本公司,
aa.vehicle_vin AS 上个版本车架号,
cc.ncd_radio AS 上个版本NCD系数,
cc.self_pricing_coefficient AS 上个版本自主定价系数,
aa.insure_number AS 上个版本保单号,
aa.ins_start_date AS 上个版本开始日期,
aa.ins_next_date AS 上个版本终止日期,
CASE
WHEN aa.use_nature = 1 THEN ‘运营’
WHEN aa.use_nature = 2 THEN ‘非运营’
END AS 上个版本运营性质,
b3.deductible AS 上个版本车损险的绝对免赔额元,
b3.payable_amount AS 上个版本车损险的保单金额元,
b4.insure_value_money AS 上个版本三者保额万元,
b4.payable_amount AS 上个版本三者保费元,
aa.payable_sum AS 上个版本保单对应的最初版本商业险总额,
t5.ins_next_date AS 保险终止日期,
IF(
YEAR(t3.ins_next_date_1) = 2026,
t3.self_pricing_coefficient,
IF(
YEAR(t3.take_effect_date) = 2026,
t3.self_pricing_coefficient,
‘-’
)
) AS 26年自主定价系数,
IF(
YEAR(t3.ins_next_date_1) = 2025,
t3.self_pricing_coefficient,
IF(
YEAR(t3.take_effect_date) = 2025,
t3.self_pricing_coefficient,
‘-’
)
) AS 25年自主定价系数,
IF(
YEAR(t3.ins_next_date_1) = 2026,
t3.ncd_radio,
IF(
YEAR(t3.take_effect_date) = 2026,
t3.ncd_radio,
‘-’
)
) AS 26年NCD系数,
IF(
YEAR(t3.ins_next_date_1) = 2025,
t3.ncd_radio,
IF(
YEAR(t3.take_effect_date) = 2025,
t3.ncd_radio,
‘-’
)
) AS 25年NCD系数,
IF(
YEAR(t3.take_effect_date) = 2025,
t3.use_nature,
IF(
YEAR(t3.ins_next_date_1) = 2025,
t3.use_nature,
‘-’
)
) AS 25年投保性质,
IF(
YEAR(t3.take_effect_date) = 2026,
t3.use_nature,
IF(
YEAR(t3.ins_next_date_1) = 2026,
t3.use_nature,
‘-’
)
) AS 26年投保性质
FROM (
SELECT
t1.id,
t1.company_name,
t1.insCompanyName,
t1.vehicle_vin,
t1.model_name,
t1.style_name,
t1.ncd_radio,
t1.self_pricing_coefficient,
t1.insure_type,
t1.insure_number,
t1.deductible,
t1.payable_amount,
t1.insure_value_money,
t1.payable_amount1,
t1.insure_value_money9,
t1.payable_amount9,
t1.insure_value_money10,
t1.payable_amount10,
t1.payable_sum,
t1.take_effect_date,
t1.ins_next_date AS ins_next_date_1,
t1.ins_start_date,
t1.use_nature,
MAX(t2.id) AS pre_id
FROM (
SELECT DISTINCT
a.id,
model.model_name,
style.style_name,
bc.company_name,
insureCompany.insurer_name AS insCompanyName,
a.vehicle_vin,
c.ncd_radio,
c.self_pricing_coefficient,
IF(a.insure_version_type = 0, ‘新投保’, ‘续保’) AS insure_type,
a.insure_number,
b1.deductible,
b1.payable_amount,
b2.insure_value_money,
b2.payable_amount AS payable_amount1,
b3.insure_value_money AS insure_value_money9,
b3.payable_amount AS payable_amount9,
b4.insure_value_money AS insure_value_money10,
b4.payable_amount AS payable_amount10,
a.payable_sum,
b.take_effect_date,
a.ins_start_date,
a.ins_next_date,
a.use_nature
FROM cop_m1_cm.ops_insure_main a
LEFT JOIN cop_m1_cm.cm_stock_vehicle veh ON a.vehicle_id = veh.id
LEFT JOIN cop_m1_cm.cm_base_model model ON veh.vehicle_type_id = model.id
LEFT JOIN cop_m1_cm.cm_base_style style ON veh.vehicle_style_id = style.id
LEFT JOIN cop_m1_cpsys.sys_company bc ON a.company_id = bc.id
LEFT JOIN cop_m1_cm.ops_insure_detail c ON a.id = c.insure_main_id
LEFT JOIN cop_m1_cm.insure_take_effect_sub b ON a.id = b.ops_insure_main_id AND b.take_effect_type = 1
LEFT JOIN cop_m1_cm.cm_base_insurer insureCompany ON insureCompany.id = a.ins_company_id
LEFT JOIN (
SELECT insure_main_id, deductible, payable_amount, insure_value_money, insure_type
FROM cop_m1_cm.ops_insure_detail
WHERE insure_type IN (2, 501)
) b1 ON b1.insure_main_id = a.id AND b1.insure_type IN (2, 501)
LEFT JOIN (
SELECT insure_main_id, deductible, payable_amount, insure_value_money, insure_type
FROM cop_m1_cm.ops_insure_detail
WHERE insure_type IN (3, 502)
) b2 ON b2.insure_main_id = a.id AND b2.insure_type IN (3, 502)
LEFT JOIN (
SELECT insure_main_id, deductible, payable_amount, insure_value_money, insure_type
FROM cop_m1_cm.ops_insure_detail
WHERE insure_type IN (9)
) b3 ON b3.insure_main_id = a.id AND b3.insure_type IN (9)
LEFT JOIN (
SELECT insure_main_id, deductible, payable_amount, insure_value_money, insure_type
FROM cop_m1_cm.ops_insure_detail
WHERE insure_type IN (10)
) b4 ON b4.insure_main_id = a.id AND b4.insure_type IN (10)
WHERE a.insure_version_type IN (0, 1)
AND a.in_use = 1
AND a.is_own_company = 1
AND a.insure_type = ‘1115569052684484610’
AND b.take_effect_date > ‘2023-01-01’
) t1
LEFT JOIN (
SELECT DISTINCT vehicle_vin, insure_number, ins_start_date, id
FROM cop_m1_cm.ops_insure_main
WHERE insure_version_type IN (0, 1)
AND is_own_company = 1
AND insure_type = ‘1115569052684484610’
GROUP BY vehicle_vin, insure_number, ins_start_date, id
) t2
ON t1.vehicle_vin = t2.vehicle_vin
AND t1.insure_number != t2.insure_number
AND t1.ins_start_date > t2.ins_start_date
GROUP BY
t1.id, t1.company_name, t1.vehicle_vin, t1.ncd_radio,
t1.self_pricing_coefficient, t1.insure_type, t1.insure_number,
t1.deductible, t1.payable_amount, t1.insure_value_money,
t1.payable_amount1, t1.payable_sum, t1.take_effect_date,
t1.ins_start_date, t1.ins_next_date, t1.use_nature
) t3
LEFT JOIN cop_m1_cm.ops_insure_main aa ON t3.pre_id = aa.id
LEFT JOIN cop_m1_cpsys.sys_company bb ON aa.company_id = bb.id
LEFT JOIN cop_m1_cm.ops_insure_detail cc ON aa.id = cc.insure_main_id
LEFT JOIN (
SELECT insure_main_id, deductible, payable_amount, insure_value_money, insure_type
FROM cop_m1_cm.ops_insure_detail
WHERE insure_type IN (2, 501)
) b3 ON b3.insure_main_id = aa.id AND b3.insure_type IN (2, 501)
LEFT JOIN (
SELECT insure_main_id, deductible, payable_amount, insure_value_money, insure_type
FROM cop_m1_cm.ops_insure_detail
WHERE insure_type IN (3, 502)
) b4 ON b4.insure_main_id = aa.id AND b4.insure_type IN (3, 502)
LEFT JOIN (
SELECT insure_number, DATE_FORMAT(ins_next_date, ‘%Y-%m-%d’) AS ins_next_date
FROM cop_m1_cm.ops_insure_main
WHERE insure_version_type = 3
AND in_use = 1
AND is_deleted = 0
) t5 ON t3.insure_number = t5.insure_number
) AS table_220411491
WHERE 1 = 1
) AS table_220411491
LEFT JOIN (
SELECT
table_1585765900.company_id AS 公司,
table_1585765900.col_2 AS 区域,
table_1585765900.col_3 AS 公司城市,
table_1585765900.col_4 AS 省,
table_1585765900.col_5 AS 市,
table_1585765900.y AS 经度,
table_1585765900.x AS 纬度
FROM (
SELECT * FROM ads.static_assets_1943
) AS table_1585765900
WHERE 1 = 1
) AS table_1585765900
ON table_220411491.公司 = table_1585765900.公司
WHERE 1 = 1
LIMIT 100 OFFSET 0
java.lang.IllegalArgumentException: Multiple entries with same key: java.nio.HeapByteBuffer[pos=4602 lim=4659 cap=5851]=165 and java.nio.HeapByteBuffer[pos=3549 lim=3606 cap=3732]=78
at com.google.common.collect.ImmutableMap.conflictException(ImmutableMap.java:378)
at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:372)
at com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:246)
at com.google.common.collect.RegularImmutableMap.fromEntryArrayCheckingBucketOverflow(RegularImmutableMap.java:133)
at com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:95)
at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:572)
at com.google.common.collect.ImmutableMap$Builder.buildOrThrow(ImmutableMap.java:600)
at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:587)
at com.starrocks.sql.optimizer.statistics.ColumnDict.merge(ColumnDict.java:123)
at com.starrocks.sql.optimizer.rule.tree.lowcardinality.DecodeCollector.mergeJoinEqColumnDicts(DecodeCollector.java:278)
at com.starrocks.sql.optimizer.rule.tree.lowcardinality.DecodeCollector.initContext(DecodeCollector.java:291)
at com.starrocks.sql.optimizer.rule.tree.lowcardinality.DecodeCollector.collect(DecodeCollector.java:189)
at com.starrocks.sql.optimizer.rule.tree.lowcardinality.LowCardinalityRewriteRule.rewrite(LowCardinalityRewriteRule.java:37)
at com.starrocks.sql.optimizer.QueryOptimizer.physicalRuleRewrite(QueryOptimizer.java:1019)
at com.starrocks.sql.optimizer.QueryOptimizer.optimizeByCost(QueryOptimizer.java:303)
at com.starrocks.sql.optimizer.QueryOptimizer.optimize(QueryOptimizer.java:212)
at com.starrocks.sql.StatementPlanner.createQueryPlanWithReTry(StatementPlanner.java:404)
at com.starrocks.sql.StatementPlanner.plan(StatementPlanner.java:154)
at com.starrocks.sql.StatementPlanner.plan(StatementPlanner.java:108)
at com.starrocks.qe.StmtExecutor.generateExecPlan(StmtExecutor.java:710)
at com.starrocks.qe.StmtExecutor.execute(StmtExecutor.java:822)
at com.starrocks.qe.ConnectProcessor.executeQueryAttempt(ConnectProcessor.java:535)
at com.starrocks.qe.ConnectProcessor.runWithParserStageRetry(ConnectProcessor.java:432)
at com.starrocks.qe.ConnectProcessor.handleQuery(ConnectProcessor.java:369)
at com.starrocks.qe.ConnectProcessor.dispatch(ConnectProcessor.java:746)
at com.starrocks.qe.ConnectProcessor.processOnce(ConnectProcessor.java:1123)
at com.starrocks.mysql.nio.MySQLReadListener.handleRequest(MySQLReadListener.java:152)
at com.starrocks.mysql.nio.MySQLReadListener.lambda$handleEvent$0(MySQLReadListener.java:92)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)