event enq: JZ – Join group dictionary when in-memory disable

该问题由MES平台的一个客户提出,某些sql会等待event enq: JZ – Join group dictionary,该等待事件比较冷门,也不确认是否会有隐患。所以让我们来分析一下。

通常我分析不熟悉的enqueue时,通常都会查询v$lock_type,可以简要的了解到该队列的含义。

可以看到JZ队列是为了串行的维护im_domain$和im_joingroup$,这两个基表与in-memory有关。具体特性与功能参考https://docs.oracle.com/en/database/oracle/oracle-database/19/inmem/optimizing-queries-with-join-groups.html。

当create join group或者drop join group时,会请求JZ队列锁,这一点应该很容易理解。

但是客户的环境在in-memory并未启用,并且并未create join group的情况下,仍然会出现等待事件enq: JZ – Join group dictionary。

通过研究发现,当使用了hash join的时候,也会请求JZ队列锁。由隐藏参数_sqlexec_join_group_aware_hj_enabled控制。

test demo:

如果没有出现性能问题的话,并不建议关闭_sqlexec_join_group_aware_hj_enabled。

不过个人猜测HASH JOIN请求的JZ锁应该是共享的,之所以会阻塞还是可能有排他模式的请求,分析队列锁,最好还是使用10046+10704 event去分析。

 

此条目发表在Oracle, Oralce performance分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注