复杂查询explain时占用读锁应该怎么解决

为了更快的定位您的问题,请提供以下信息,谢谢
【详述】问题详细描述
首先发现 通过stream load写入时会经常报错: get database write lock timeout
后来发现有一个异步物化视图任务和临时查询都会报错:
ERROR 1064 (HY000): StarRocks planner use long time 10000 ms in logical phase, This probably because 1. FE Full GC, 2. Hive external table fetch metadata took a long time, 3. The SQL is very complex. You could 1. adjust FE JVM config, 2. try query again, 3. enlarge new_planner_optimize_timeout session variable

对于复杂查询执行explain也是一样报上面的错误。

尝试拿了fe上的stack信息:

"starrocks-mysql-nio-pool-14650" #9052652 daemon prio=5 os_prio=0 tid=0x00007f3cf4017800 nid=0x119b runnable [0x00007f3ccf90d000]

java.lang.Thread.State: RUNNABLE
at com.starrocks.sql.optimizer.CTEUtils.findCteAnchor(CTEUtils.java:60)
at com.starrocks.sql.optimizer.CTEUtils.collectCteConsume(CTEUtils.java:42)
at com.starrocks.sql.optimizer.CTEUtils.collectCteOperators(CTEUtils.java:22)
at com.starrocks.sql.optimizer.Optimizer.logicalRuleRewrite(Optimizer.java:220)
at com.starrocks.sql.optimizer.Optimizer.rewriteAndValidatePlan(Optimizer.java:363)
at com.starrocks.sql.optimizer.Optimizer.optimizeByCost(Optimizer.java:134)
at com.starrocks.sql.optimizer.Optimizer.optimize(Optimizer.java:95)
at com.starrocks.sql.StatementPlanner.createQueryPlan(StatementPlanner.java:119)
at com.starrocks.sql.StatementPlanner.planQuery(StatementPlanner.java:99)
at com.starrocks.sql.StatementPlanner.plan(StatementPlanner.java:75)
at com.starrocks.sql.StatementPlanner.plan(StatementPlanner.java:42)
at com.starrocks.qe.StmtExecutor.execute(StmtExecutor.java:396)
at com.starrocks.qe.ConnectProcessor.handleQuery(ConnectProcessor.java:355)
at com.starrocks.qe.ConnectProcessor.dispatch(ConnectProcessor.java:472)
at com.starrocks.qe.ConnectProcessor.processOnce(ConnectProcessor.java:730)
at com.starrocks.mysql.nio.ReadListener.lambda$handleEvent$0(ReadListener.java:55)
at com.starrocks.mysql.nio.ReadListener$$Lambda$466/390303872.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:750)

Locked ownable synchronizers:
- <0x000000044cb21bc8> (a java.util.concurrent.ThreadPoolExecutor$Worker)

发现这个plan阶段会尝试拿db级别的readlock,阻塞后续操作。伴随一段时间内查询和写入失败。

从代码逻辑上看new_planner_optimize_timeout和query_timeout都无法覆盖这个逻辑来主动停止查询。

【背景】做过哪些操作?

尝试调整过参数:

  1. thrift_rpc_timeout_ms:15000
  2. catalog_try_lock_timeout_ms:10000
  3. new_planner_optimize_timeout:10000

【业务影响】影响读写
【是否存算分离】否
【StarRocks版本】2.5.10
【集群规模】3fe+5be
【机器信息】8C/64G/万兆
【联系方式】StarRocks社区群5 - GreenSY
【附件】

建议升级到 2.5最新版,从 2.5.11版本开始支持 通过 set cbo_use_lock_db = false 来规避该问题

好的,我们找时间升级一下看看

升级2.5.18之后目前看起来不会锁库了。
不过这种执行计划阶段时间长的query没有办法被query_timeout和new_planner_optimize_timeout参数限制住。