实用SQL-查询数据库中所有的buffer表及其级别

对于一些热点表,为了避免读放大问题,会对其设置为buffer表,调整表的合并策略(table_mode),这类表多了后需要统一管理,需要统计数据库中哪些表是设置了table_mode以及设置的table_mode的级别,下面是查询这类场景的SQL小技巧

-- 创建6张表
create table t0(id int);
create table t1(id int);
create table t2(id int);
create table t3(id int);
create table t4(id int);
create table t5(id int);

-- 对其中5张表分别调整合并策略
alter table t1 set table_mode='normal';
alter table t2 set table_mode='queuing';
alter table t3 set table_mode='moderate';
alter table t4 set table_mode='super';
alter table t5 set table_mode='extreme';
 
-- 用基础库查看表的类型
obclient [test]> select tenant_id,table_id,table_name,table_type,table_mode,(table_mode & 0xff) AS table_mode_1 from oceanbase.__all_table where table_name in('t0','t1','t2','t3','t4','t5');
+-----------+----------+------------+------------+------------+--------------+
| tenant_id | table_id | table_name | table_type | table_mode | table_mode_1 |
+-----------+----------+------------+------------+------------+--------------+
|         0 |   500011 | t0         |          3 |      66048 |            0 | -- 未设置合并策略
|         0 |   500006 | t1         |          3 |      66048 |            0 | -- 设置了normal(默认值)合并策略,和未设置状态一样
|         0 |   500007 | t2         |          3 |      66049 |            1 | -- queuing
|         0 |   500008 | t3         |          3 |      66051 |            3 | -- moderate
|         0 |   500009 | t4         |          3 |      66052 |            4 | -- super
|         0 |   500010 | t5         |          3 |      66053 |            5 | -- extreme
+-----------+----------+------------+------------+------------+--------------+
6 rows in set (0.004 sec)

7 个赞

111

5 个赞

666

5 个赞

谢谢楼主分享!

个人验证了一下,不同的版本,支持设置级别不同,比如社区版只支持到queuing 级别

obclient(root@mysql_tenant)[test]> select version();
+---------------------------+
| version()                 |
+---------------------------+
| 5.7.25-OceanBase-v4.3.1.0 |
+---------------------------+
1 row in set (0.002 sec)

obclient(root@mysql_tenant)[test]> alter table t5 set table_mode='extreme';
ERROR 1149 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use
obclient(root@mysql_tenant)[test]>  select tenant_id,table_id,table_name,table_type,table_mode,(table_mode & 0xff) AS table_mode_1 from oceanbase.__all_table where table_name in('t0','t1','t2','t3','t4','t5');
+-----------+----------+------------+------------+------------+--------------+
| tenant_id | table_id | table_name | table_type | table_mode | table_mode_1 |
+-----------+----------+------------+------------+------------+--------------+
|         0 |   500002 | t0         |          3 |      66048 |            0 |
|         0 |   500003 | t1         |          3 |      66048 |            0 |
|         0 |   500004 | t2         |          3 |      66049 |            1 |
|         0 |   500005 | t3         |          3 |      66048 |            0 |
|         0 |   500006 | t4         |          3 |      66048 |            0 |
|         0 |   500007 | t5         |          3 |      66048 |            0 |
+-----------+----------+------------+------------+------------+--------------+
6 rows in set (0.049 sec)

obclient(root@mysql_tenant)[test]>
5 个赞

谢谢分享,学习了

4 个赞

非常好的思路!另外补充一点,在[特定场景/版本]下,还可以考虑[另一种方法],有时效果也不错。

4 个赞

不错哦

4 个赞

支持一下!加油

4 个赞

试试不加set的语法,我记得有人提到过有些语法差异

alter table t5 table_mode='extreme';
6 个赞

感谢分享

4 个赞

不错的分享

4 个赞

感谢分享

2 个赞

感谢分享

2 个赞

不错不错

1 个赞

感谢分享

1 个赞

666

1 个赞

:thinking: :thinking: :thinking:

1 个赞

学习学习

支持一下

:+1: :+1: