按照官网的说法,当查询的行数(包括中间结果,基于统计信息)大于这个参数(expensive-threshold)的值,该操作会被认为是 expensive 查询,并输出一个前缀带有 [EXPENSIVE_QUERY] 的日志。
但是当我自己测试,我全表扫描1个76568行的表,tidb.log 也不会有EXPENSIVE_QUERY,是不是说要想让tidb.log 产生expensive query 还需要达到 tidb_mem_quota_query
或者 tidb_expensive_query_time_threshold
设定的值才行,光达到expensive-threshold 不管用?大家可以试下,很容易试出来的
文档上有介绍阿,哪个是输出明细行数,触发这个定位的,还是依靠图中描述的默认设置,也可以按照场景需求修改这个配置
https://docs.pingcap.com/zh/tidb/stable/identify-expensive-queries#定位消耗系统资源多的查询
帮顶了,和题主有相同的疑问,expensive-threshold这个TiDB配置项到底有什么用?它和mem-quota-query、tidb_expensive_query_time_threshold之间是什么逻辑关系?
三个参数缺一不可的概念(在我们配置整体资源时,对单个SQL占用或者使用资源肯定会有一个限额的,也可以叫做安全限值),然后我理解是组合使用
比如:
- 行数 + 超时时间
- 行数 + 内存限制
- 行数 + 超时时间 + 内存限制
帮助来衡量有哪些查询会超出这个范围,就帮我们记录一下,后期方便排查,也就是个定位的功能
大概懂了,谢谢老师,看来官方文档没有完全说清楚,可能需要自己测试或者翻代码才行
tidb_expensive_query_time_threshold
是一个环境变量,可通过set session/global方式在线修改,当SQL执行时间超过该之后会被记录到tidb.log的 expensive_query。
expensive-threshold
是一个参数,需要使用tiup edit-config这类命令修改,这个是根据统计信息计算执行计划中的步骤是否超阈值,超过阈值的话实际执行时会以低优先级运行,貌似并不记录到tidb.log,目前记录到tidb.log的只有超expensive_query_time和memory_quota的SQL。
https://github.com/pingcap/tidb/issues/7804
expensive-threshold暂时只是个摆设?
大佬,优秀
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。