【 TiDB 使用环境】生产环境 /测试/ Poc
手动analyze table 命令如下,
ANALYZE TABLE a WITH 0.01 SAMPLERATE, 20 BUCKETS
执行了300多秒后报错
1105 - Your query has been cancelled due to exceeding the allowed memory limit for the tidb-server instance and this query is currently using the most memory. Please try narrowing your query scope or increase the tidb_server_memory_limit and try again.[conn=824554376]
使用内存超过20G
这个硬件限制,只能加内存。
这个表几十个T 多大内存也不够
如果不能加内存的话只能降低采样率或者桶的数量了
https://docs.pingcap.com/zh/tidb/v7.5/system-variables/#tidb_analyze_skip_column_types-从-v720-版本开始引入 把 text 也跳过
临时调整 限制 SET GLOBAL tidb_server_memory_limit = ‘30G’; 然后在调整回来?
可以寻求一些数据库外的解决方案,例如磁盘当内存使用。这个可以看一下。
【运维】将Linux的硬盘当内存用,Linux内存不够用的时候如何用硬盘提升内存_如何把外置硬盘变为linux的内存-CSDN博客
这个好像真没啥好办法了,加内存或者将大表拆分下,分表或分区。analyze应该也是支持分区统计分析的
调整参数也是一个思路吧,可以试试看
哈哈,那又回来mysql的玩法了
https://docs.pingcap.com/zh/tidb/stable/statistics/#收集部分列的统计信息
收集部分列,把大字段排掉,采样比可以自动,还不行就调小采样比。
表几十个t 采样率已经改到0.01了。这个表一共才四五个列,怎么改都会超出内存限制。
1、跳过无关或大列类型
如果表中存在 TEXT、BLOB、JSON 列,而这些列对查询优化统计意义不大,可设置 tidb_analyze_skip_column_types 跳过这些类型,从而减少内存负载。
2、降低采样率与桶数
虽然用户已经设了 0.01,但如仍超限,可以再调得更低;或者减少桶数(bucket 数量越多分析越细,内存越多)。
但要权衡统计精度 vs 系统资源。
3、按分区或拆表进行统计
如果该大表是一个单一大表,无分区,建议启动分区表或拆为多个逻辑子表。之后对每个分区/子表分别执行 ANALYZE,这样单次操作内存占用会更小。
在 TiDB 中,分区表分析可能有优化路径。
4、调整内存限制(如果资源允许)
将 tidb_server_memory_limit 提高到一个更高阈值(例如 30G 或更高,视节点内存情况)可以暂时缓解。
但这只是治标,不宜长期依赖,且耗费资源大。
有好的处理方式了没
分库分表分区
show global variables like ‘tidb_server_memory_limit’;
这个变量设置的多大?如果是80%的话,那感觉机器配置太低了,扩台内存的更大的机器来执行analyze吧 ![]()
最好不要自己升级 analyze 的采样率,另外设置了之后,请到 analyze options 里删除
另外你看一下有没有分区表,如果有 tidb_enable_async_merge_global_stats 是否打开。
tidb_enable_historical_stats 检查一下这个有没有关闭
再检查一下表里面是否有大类型,有的话,请修改 tidb_analyze_skip_column_types
2、3 不建议
这看着是不是bug