基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
SQL 在数据库中的执行时间超过 OB_QUERY_TIMEOUT 的原因
更新时间:2026-05-15 09:06
Session 变量 ob_query_timeout 控制一条 SQL 在数据库中运行的最大时间。如果 SQL 因为租户队列满而排队,排队的时间是不计入执行时间的,因此就可能出现 SQL 在数据库中的总时间大于 ob_query_timeout 的现象。
每个租户都有固定数量的 worker 线程来执行 SQL。当 SQL 请求数量大于 worker 线程数量时,OceanBase 数据库会将一些 SQL 放入到队列里等待 worker 线程。队列里排队的 SQL 越多,SQL 排队的时间越长。但是,这并不意味着 SQL 可以在队列里无限等待。ODP 也有 SQL 超时机制,默认设置下,ODP 的 SQL 超时时间是 ob_query_timeout + 20s。假如 ob_query_timeout=10s,当一条 SQL 经过 ODP 发送到 OBServer 后,该 SQL 最多会在 OBServer 中等待/执行 30s 后被 ODP 做超时处理,即发送给应用 SQL 超时的报错并中断链接。
此外,除了 SQL 的 worker 线程外,PX 并行访问也有线程数量的限制。对于指定 Parallel(N) 进行并发访问的 SQL,如果 PX 线程数量不满足 N 的要求,可能也会出现等待的现象。与等待 worker 线程不同的是,等待 PX 线程的时间是计入 ob_query_timeout 中的。
适用版本
OceanBase 数据库所有版本。