analyze报错runtime error: index out of range [47] with length 46,已经做了一些操作但无效

【 TiDB 使用环境】POC环境

【 TiDB 版本】8.5.1

【复现路径】做过哪些操作出现的问题 / 【遇到的问题:问题现象及影响】

建表语句

CREATE TABLE `t_data_info_main` (
  `f101` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '编码1',
  `f102` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '编码2',
  `f103` varchar(300) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '名称',
  `f104` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '地区1',
  `f105` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '地区2',
  `f106` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '地区3',
  `f107` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '属性1',
  `f108` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '属性2',
  `f109` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '属性3',
  `f110` varchar(300) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '标识码',
  `f111` varchar(300) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '地址信息',
  `f112` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '大区标识',
  `f113` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '区域标识',
  `f114` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '系统编码',
  `f115` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '级别信息',
  `f116` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '经度信息',
  `f117` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '纬度信息',
  `f118` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '类型信息',
  `f119` varchar(4000) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '经营信息',
  `f120` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '上级编码',
  `f121` varchar(300) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '上级名称',
  `f122` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '标识1',
  `f123` longtext COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '扩展信息1',
  `f124` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '版本信息1',
  `f125` bigint DEFAULT NULL COMMENT '合并ID',
  `f126` datetime DEFAULT NULL COMMENT '合并时间',
  `f127` varchar(100) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作场景',
  `f128` varchar(500) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作原因',
  `f129` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态1',
  `f130` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建人',
  `f131` datetime DEFAULT NULL COMMENT '创建时间',
  `f132` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '修改人',
  `f133` datetime DEFAULT NULL COMMENT '修改时间',
  `f134` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '版本号',
  `f135` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标识',
  `f136` bigint NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */ COMMENT '主键ID',
  `f137` json DEFAULT NULL COMMENT '扩展字段',
  `f138` varchar(100) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.attribute_level4'))) VIRTUAL COMMENT '属性4',
  `f139` varchar(100) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.attribute_level5'))) VIRTUAL COMMENT '属性5',
  `f140` varchar(300) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.hospital_level'))) VIRTUAL COMMENT '等级1',
  `f141` varchar(300) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.hospital_grade'))) VIRTUAL COMMENT '等级2',
  `f142` varchar(300) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.postal_code'))) VIRTUAL COMMENT '编码3',
  `f143` varchar(32) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.is_target'))) VIRTUAL COMMENT '标识2',
  `f144` varchar(32) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.is_customer_provided'))) VIRTUAL COMMENT '标识3',
  `f145` varchar(32) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.continuation_status'))) VIRTUAL COMMENT '状态2',
  `f146` varchar(256) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.check_result'))) VIRTUAL COMMENT '结果1',
  `f147` varchar(256) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.note'))) VIRTUAL COMMENT '说明1',
  `f148` varchar(256) COLLATE utf8mb4_general_ci GENERATED ALWAYS AS (json_unquote(json_extract(`f137`, _utf8mb4'$.remark'))) VIRTUAL COMMENT '备注1',
  PRIMARY KEY (`f136`) /*T![clustered_index] CLUSTERED */,
  KEY `idx_f122` (`f122`),
  KEY `idx_f108` (`f108`),
  KEY `idx_f105` (`f105`),
  KEY `idx_f107` (`f107`),
  KEY `idx_f103` (`f103`),
  KEY `idx_f104` (`f104`),
  UNIQUE KEY `udx_f102` (`f102`,`f135`,`f134`),
  KEY `idx_f102` (`f102`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci /*T![auto_rand_base] AUTO_RANDOM_BASE=180060000 */ COMMENT='通用数据主表';

相关报错errorklog:

已经做的:(论坛搜索可能是虚拟列问题,排除虚拟列)

set global tidb_analyze_skip_column_types='json,blob,mediumblob,longblob,mediumtext,longtext';

如果设置tidb_analyze_skip_column_types=‘json’ 报QL 错误 [1105] [HY000]: runtime error: index out of range [47] with length 47,设置set global tidb_analyze_skip_column_types=‘json,blob,mediumblob,longblob,mediumtext,longtext’; 报runtime error: index out of range [47] with length 46

1 个赞

感觉是表结构异常或元数据不一致,比如:列数与索引定义不匹配、存在损坏的统计信息、或 DDL 变更未完全同步。试试以下命令:

– 删除该表统计信息
ADMIN DROP STATS your_table;

– 再重新 analyze
ANALYZE TABLE your_table;

1 个赞

还是报同样的错
SQL 错误 [1105] [HY000]: runtime error: index out of range [47] with length 46

1 个赞

TiDB 8.5.1 支持调整统计信息收集的分片大小,规避数组越界:

sql

-- 临时调低 ANALYZE 分片大小(默认 100000,改为 10000)
SET GLOBAL tidb_analyze_partition_size = 10000;
SET GLOBAL tidb_analyze_sample_rate = 0.01;  -- 降低采样率,减少数据处理量

-- 重新执行 ANALYZE
ANALYZE TABLE your_db.your_table WITH 1000 SAMPLES;  -- 指定采样数,进一步降低压力
1 个赞

你这变量我在官方文档里都没找到啊- -#

1 个赞

SET GLOBAL tidb_analyze_skip_column_types = ‘’; – 取消跳过 JSON 和 TEXT

1 个赞

我们使用虚拟列非常非常的多,如果虚拟列加入表分析,会引起db的性能使用极具上升,之前遇到过大字段的表分析,直接卡死tidb。

1 个赞

ANALYZE TABLE t_data_info_main COLUMNS f101, f102, f103, f104, f105, f106, f107, f108, f109, f110, f111, f112, f113, f114, f115, f116, f117, f118, f119, f120, f121, f122, f123,
f124, f125, f126, f127, f128, f129, f130, f131, f132, f133, f134, f135, f136, f137;
我测的853版本,指定列,去掉虚拟列收集就可以。应该还是虚拟列的问题。

1 个赞

这结构太长了啊

用另外一个表名去创建看看行不行,如果另外一个表名可以创建,只是这个表名创建不了还是可能元数据的问题。如果另外一个表名也创建不了,才考虑tidb配置或者sql的原因。

应该是这个问题
https://github.com/pingcap/tidb/issues/62465。

8.5.4 版本修复了这个问题。

这是出现bug了吧

这些虚拟列表达式很复杂吗? 表很大吗?