【有问选答】商业版 Oracle 模式下的 user_xxxx 字典查询慢,如何优化?

数据库版本:OceanBase 4.2.1.3 (r103000052023122809-421942b04846ae02bfcdf5626f16e763f9445cf7) (Built Dec 28 2023 09:49:47)
租户:oracle模式。

如下:查询数据库的字典,随便查询个表5秒以上:
select * from USER_INDEXES where table_name=?

查看执行计划如下:

由于我们有升级组件需要根据字典查询表信息,java执行如下sql直接报超时。使用odc查询也要120+秒。如何优化?
SELECT

A.INDEX_NAME,

A.UNIQUENESS,

A.COMPRESSION,

A.TABLE_NAME,

A.INDEX_TYPE,

A.TABLESPACE_NAME,

A.PARTITIONED,

B.COLUMN_NAME,

B.DESCEND,

B.COLUMN_POSITION,

C.CONSTRAINT_TYPE,

C.CONSTRAINT_NAME

FROM

USER_INDEXES A

LEFT JOIN (

SELECT

  COLUMN_NAME,

  DESCEND,

  COLUMN_POSITION,

  TABLE_NAME,INDEX_NAME

FROM

  USER_IND_COLUMNS

WHERE

  COLUMN_NAME != 'SYS_SESSION_ID'

  AND TABLE_NAME = ?

) B ON A.TABLE_NAME = B.TABLE_NAME

AND A.INDEX_NAME = B.INDEX_NAME

LEFT JOIN (

SELECT

  CONSTRAINT_NAME,

  TABLE_NAME,

  CONSTRAINT_TYPE,

  INDEX_NAME,

  INDEX_OWNER

FROM

  USER_CONSTRAINTS

WHERE

  CONSTRAINT_TYPE = 'P'

  AND TABLE_NAME =?

) C ON A.TABLE_NAME = C.TABLE_NAME

AND A.INDEX_NAME = C.INDEX_NAME

WHERE

DROPPED = ‘NO’

AND A.INDEX_TYPE IN (‘FUNCTION-BASED NORMAL’, ‘NORMAL’)

AND A.TABLE_NAME = ?

ORDER BY

A.INDEX_NAME,

B.COLUMN_POSITION

看 sys租户和业务租户的资源情况(cpu、内存)

ora属于企业版模式,可以联系企业版的交付同学。
也可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。
OceanBase官网商务咨询

sys租户unit也调大了,sys租户与应用租户 qps,tps,等待等指标都不高。

请不要扯交付

哈哈,大家在社区里讨论的都是社区版本的问题,您直接抛商业版独有的 Oracle 模式租户下的问题,大家都没用过商业版,也肯定没遇到过,所以可能没办法给您进行反馈。

如果您问商业版 MySQL 租户下的问题,我们还可以在社区版的测试环境里复现下一起帮您看看,比如你说你发现商业版的 MySQL 租户里有某个字典视图性能不优,肯定会有人站出来帮你解决的。但如果是商业版独有的功能出了问题,我们这些只用过社区版的人着实没法儿看呀,哈哈,希望您能理解。

简单瞅了一眼这张字典视图的代码实现,感觉 Oracle 模式下的 USER_INDEXES 字典视图实现的很复杂,而且相关内部表在 table name 列上好像也没有索引,您可以直接在这里搜下 USER_INDEXES 关键字查看字典视图定义:https://raw.githubusercontent.com/oceanbase/oceanbase/develop/src/share/inner_table/ob_inner_table_schema_def.py

所以如果您购买的是商业版,还是建议您找商业版的售后人员提一个 Oracle 模式下独有字典视图的性能优化的需求,看上去 USER_INDEXES 在实现上应该还是有优化空间的,哈哈~

By the way,如果是我的话,可能就根据字典视图定义自己去攒一个效率更高的查询方式了,例如直接拿 SYS.ALL_VIRTUAL_TABLE_REAL_AGENT 查出有效的信息就好了,没必要非得依赖那个字典视图。那个字典视图定义看上去为了兼容 Oracle 的行为,实现的究极复杂(详见上面那个链接)。

2 个赞

选入有问必答板块~ :rofl: