有没有办法通过sys 租户的某些视图查到业务租户里面对应表分区的数据量?

【 使用环境 】测试环境
【 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 个赞

根据文档库中的信息,您提到的 oceanbase.CDB_TAB_PARTITIONSoceanbase.CDB_TAB_SUBPARTITIONS 视图确实可以用来查看业务租户中表的分区信息,但是这些视图中的 NUM_ROWS 字段目前并不支持,因此会显示为 NULL[1]

如果您需要获取业务租户中表分区的数据量,可以考虑使用 DBMS_STATS 包来收集统计信息,然后查询 oceanbase.DBA_TAB_PARTITIONSoceanbase.DBA_TAB_SUBPARTITIONS 视图中的 NUM_ROWS 字段。 [1]

具体步骤如下:

  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;
    
  2. 查询分区数据量
    收集完统计信息后,可以通过查询 oceanbase.DBA_TAB_PARTITIONSoceanbase.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. 系统视图总览
1 个赞

不靠谱,采集不到

1 个赞

感谢您的反馈。如果使用 DBMS_STATS 包收集统计信息仍然无法获取到 NUM_ROWS,那么可能是因为当前版本的 OceanBase 社区版确实不支持通过系统视图直接获取分区的数据量。[1]

在这种情况下,您可以考虑以下几种替代方案:

  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;
    
  2. 使用 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';
    
  3. 使用外部工具
    如果上述方法仍然不能满足需求,您可以考虑使用外部工具或脚本来定期收集和存储分区的数据量。例如,编写一个定时任务脚本,使用上述 SQL 查询并将结果存储在一个单独的表中,以便后续查询。

希望这些方法能帮助您解决问题。如果还有其他疑问或需要进一步的帮助,请随时联系 OceanBase 的人工答疑或社区支持。

具体信息可参考以下文档:

  1. IMPORT_INDEX_STATS
  2. SQL FAQ
  3. mysql.db
  4. RELEASE_ALL_LOCKS()
  5. 删除资源组
  6. GET_PREFS
  7. IMPORT_TABLE_STATS
  8. IMPORT_SCHEMA_STATS
  9. DELETE_TABLE_STATS

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

1 个赞

通过sys租户查询业务租户分区表的数据量 是不支持的。

1 个赞