【 使用环境 】测试环境
【 OB or 其他组件 】 OB
【 使用版本 】V4
【问题描述】
官网上我看是有个 oceanbase.CDB_TAB_PARTITIONS 和 oceanbase.CDB_TAB_SUBPARTITIONS 这两张视图,但是里面的NUM_ROWS 暂时不支持,都是显示为NULL
找了一圈好像没找到其他的视图可以展示的,大佬们还有其他招吗?
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000641324
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000641206
【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手 ] 即可召唤小助手,欢迎试用!
1 个赞
论坛小助手
2024 年10 月 18 日 17:26
#3
根据文档库中的信息,您提到的 oceanbase.CDB_TAB_PARTITIONS
和 oceanbase.CDB_TAB_SUBPARTITIONS
视图确实可以用来查看业务租户中表的分区信息,但是这些视图中的 NUM_ROWS
字段目前并不支持,因此会显示为 NULL
。 [1]
如果您需要获取业务租户中表分区的数据量,可以考虑使用 DBMS_STATS
包来收集统计信息,然后查询 oceanbase.DBA_TAB_PARTITIONS
或 oceanbase.DBA_TAB_SUBPARTITIONS
视图中的 NUM_ROWS
字段。 [1]
具体步骤如下:
收集统计信息 :
使用 DBMS_STATS
包来收集表或分区的统计信息。例如:
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'your_tenant_name',
tabname => 'your_table_name',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO',
cascade => TRUE
);
END;
查询分区数据量 :
收集完统计信息后,可以通过查询 oceanbase.DBA_TAB_PARTITIONS
或 oceanbase.DBA_TAB_SUBPARTITIONS
视图来获取分区的数据量。例如:
SELECT
TABLE_NAME,
PARTITION_NAME,
NUM_ROWS
FROM
oceanbase.DBA_TAB_PARTITIONS
WHERE
TABLE_OWNER = 'your_tenant_name'
AND TABLE_NAME = 'your_table_name';
或者查询二级分区:
SELECT
TABLE_NAME,
PARTITION_NAME,
SUBPARTITION_NAME,
NUM_ROWS
FROM
oceanbase.DBA_TAB_SUBPARTITIONS
WHERE
TABLE_OWNER = 'your_tenant_name'
AND TABLE_NAME = 'your_table_name';
通过上述步骤,您可以获取到业务租户中表分区的数据量。希望这能解决您的问题。如果还有其他疑问,欢迎继续提问。
更多信息请查看:
系统视图总览
1 个赞
论坛小助手
2024 年10 月 18 日 18:47
#5
感谢您的反馈。如果使用 DBMS_STATS
包收集统计信息仍然无法获取到 NUM_ROWS
,那么可能是因为当前版本的 OceanBase 社区版确实不支持通过系统视图直接获取分区的数据量。[1]
在这种情况下,您可以考虑以下几种替代方案:
使用 COUNT
查询 :
直接对每个分区执行 COUNT
查询来获取数据量。虽然这种方法可能比较耗时,但它是最直接的方法。例如:
SELECT
PARTITION_NAME,
COUNT(*) AS NUM_ROWS
FROM
your_table_name
PARTITION (partition_name)
GROUP BY
PARTITION_NAME;
如果您有多个分区,可以编写一个脚本来自动化这个过程。例如,使用 PL/SQL:
DECLARE
v_sql VARCHAR2(1000);
v_partition_name VARCHAR2(100);
v_num_rows NUMBER;
CURSOR c_partitions IS
SELECT PARTITION_NAME
FROM ALL_TAB_PARTITIONS
WHERE TABLE_OWNER = 'your_tenant_name'
AND TABLE_NAME = 'your_table_name';
BEGIN
FOR partition_rec IN c_partitions LOOP
v_partition_name := partition_rec.PARTITION_NAME;
v_sql := 'SELECT COUNT(*) FROM your_table_name PARTITION (' || v_partition_name || ')';
EXECUTE IMMEDIATE v_sql INTO v_num_rows;
DBMS_OUTPUT.PUT_LINE('Partition: ' || v_partition_name || ', Num Rows: ' || v_num_rows);
END LOOP;
END;
使用 INFORMATION_SCHEMA
视图 :
虽然 INFORMATION_SCHEMA
视图可能不直接提供分区的数据量,但您可以结合 INFORMATION_SCHEMA.PARTITIONS
视图和 COUNT
查询来获取所需信息。例如:
SELECT
p.TABLE_NAME,
p.PARTITION_NAME,
(SELECT COUNT(*) FROM your_table_name PARTITION (p.PARTITION_NAME)) AS NUM_ROWS
FROM
INFORMATION_SCHEMA.PARTITIONS p
WHERE
p.TABLE_SCHEMA = 'your_tenant_name'
AND p.TABLE_NAME = 'your_table_name';
使用外部工具 :
如果上述方法仍然不能满足需求,您可以考虑使用外部工具或脚本来定期收集和存储分区的数据量。例如,编写一个定时任务脚本,使用上述 SQL 查询并将结果存储在一个单独的表中,以便后续查询。
希望这些方法能帮助您解决问题。如果还有其他疑问或需要进一步的帮助,请随时联系 OceanBase 的人工答疑或社区支持。
具体信息可参考以下文档:
IMPORT_INDEX_STATS
SQL FAQ
mysql.db
RELEASE_ALL_LOCKS()
删除资源组
GET_PREFS
IMPORT_TABLE_STATS
IMPORT_SCHEMA_STATS
DELETE_TABLE_STATS
(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)
1 个赞
旭辉
2024 年10 月 21 日 10:48
#6
通过sys租户查询业务租户分区表的数据量 是不支持的。
1 个赞