You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle层级构建、根节点统计问题及PowerBI报表求助

Oracle层级查询与PowerBI报表问题解决

需求说明

  • 在Oracle中构建层级结构(对应原query1)
  • 统计每个根节点及其下属子节点总数(对应原query2)
  • 基于查询结果在PowerBI中制作报表

原查询语句

query1:构建层级结构

SELECT 
    PARENT AS "PARENT",
    CHILD AS "CHILD",
    LEVEL AS "LEVEL",
    PARENT_CLASS AS "PARENT_CLASS",
    CHILD_CLASS AS "CHILD_CLASS",
    CREATED_ON_RELCI AS "CREATED_ON_RELCI",
    UPDATED_ON_RELCI AS "UPDATED_ON_RELCI"
FROM (   
    SELECT DISTINCT
        CI1.NAME AS PARENT,
        CI2.NAME AS CHILD,
        CI1.SYS_CLASS_NAME AS PARENT_CLASS,
        CI2.SYS_CLASS_NAME AS CHILD_CLASS,
        RELCI.SYS_CREATED_ON AS CREATED_ON_RELCI,
        RELCI.SYS_UPDATED_ON AS UPDATED_ON_RELCI
    FROM  SN_REPORTING.REP_CMDB_REL_CI RELCI  
    LEFT JOIN SN_REPORTING.REP_CMDB_CI_SERVICE CIS
        ON RELCI.PARENT=CIS.SYS_ID
    LEFT JOIN SN_REPORTING.REP_CMDB_CI CI1
        ON RELCI.PARENT=CI1.SYS_ID
    LEFT JOIN SN_REPORTING.REP_CMDB_CI CI2
        ON RELCI.CHILD=CI2.SYS_ID
    WHERE RELCI.SYS_UPDATED_ON >= TO_DATE('01-01-18', 'MM-DD-YYYY')
)A
CONNECT BY NOCYCLE A.PARENT = PRIOR A.CHILD

query2:统计根节点及子节点总数

select ( count(*)-1 ) Child_Node_Count,
       root
from ( select connect_by_root(parent) root
       from  SN_REPORTING.SERVICE_LIFECYCLE_WITHOUT_HIERARCHY_FILTER_VW
       connect by nocycle parent = prior child
     )
group by root
/

遇到的问题

  • 单独运行query1可正常获取层级结果,但写入存储过程时因"HIERARCHY"字段报错;
  • 移除该字段后编写存储过程统计根节点及子节点数,查询长时间运行后抛出表空间错误;
  • 数据导入PowerBI时持续加载无法完成,且因表空间错误无法查看数据库总数据量。

问题解决与查询合并方案

1. 存储过程"HIERARCHY"字段报错处理

原query1中并无HIERARCHY字段,报错大概率是存储过程定义时的字段/变量名冲突,或是代码拷贝时误引入了不存在的字段。解决步骤:

  • 检查存储过程的参数、返回类型定义,确保没有使用与现有对象冲突的名称;
  • 严格对齐query1的字段列表,不要额外添加未定义的字段。

2. 表空间错误与查询性能优化

表空间错误通常是临时表空间不足或结果集过大导致。以下是合并query1和query2的优化版查询,同时解决性能问题:

合并后的查询语句

该查询返回层级节点详细信息,同时附带对应根节点的子节点总数:

WITH hierarchy_data AS (
    SELECT 
        PARENT,
        CHILD,
        LEVEL AS "LEVEL",
        PARENT_CLASS,
        CHILD_CLASS,
        CREATED_ON_RELCI,
        UPDATED_ON_RELCI,
        CONNECT_BY_ROOT PARENT AS ROOT_NODE
    FROM (   
        SELECT DISTINCT
            CI1.NAME AS PARENT,
            CI2.NAME AS CHILD,
            CI1.SYS_CLASS_NAME AS PARENT_CLASS,
            CI2.SYS_CLASS_NAME AS CHILD_CLASS,
            RELCI.SYS_CREATED_ON AS CREATED_ON_RELCI,
            RELCI.SYS_UPDATED_ON AS UPDATED_ON_RELCI
        FROM  SN_REPORTING.REP_CMDB_REL_CI RELCI  
        LEFT JOIN SN_REPORTING.REP_CMDB_CI_SERVICE CIS
            ON RELCI.PARENT=CIS.SYS_ID
        LEFT JOIN SN_REPORTING.REP_CMDB_CI CI1
            ON RELCI.PARENT=CI1.SYS_ID
        LEFT JOIN SN_REPORTING.REP_CMDB_CI CI2
            ON RELCI.CHILD=CI2.SYS_ID
        WHERE RELCI.SYS_UPDATED_ON >= TO_DATE('01-01-18', 'MM-DD-YYYY')
    )A
    CONNECT BY NOCYCLE A.PARENT = PRIOR A.CHILD
),
root_child_counts AS (
    SELECT 
        ROOT_NODE,
        COUNT(*) - 1 AS CHILD_NODE_COUNT  -- 减1排除根节点自身
    FROM hierarchy_data
    GROUP BY ROOT_NODE
)
SELECT 
    hd.PARENT,
    hd.CHILD,
    hd."LEVEL",
    hd.PARENT_CLASS,
    hd.CHILD_CLASS,
    hd.CREATED_ON_RELCI,
    hd.UPDATED_ON_RELCI,
    hd.ROOT_NODE,
    rcc.CHILD_NODE_COUNT
FROM hierarchy_data hd
JOIN root_child_counts rcc
    ON hd.ROOT_NODE = rcc.ROOT_NODE;

优化建议

  • 给SN_REPORTING.REP_CMDB_REL_CI.SYS_UPDATED_ON创建索引,加速数据过滤;
  • 联系DBA检查并扩展临时表空间,避免查询过程中空间耗尽;
  • 存储过程中添加分页逻辑(如WHERE ROWNUM <= 1000或FETCH NEXT 1000 ROWS ONLY),减少单批次返回数据量;
  • 确认SERVICE_LIFECYCLE_WITHOUT_HIERARCHY_FILTER_VW与query1数据源一致性,避免重复扫描不同表。

3. PowerBI数据导入问题解决

  • 先验证合并后的查询在Oracle中能快速返回结果,若查询耗时过长,PowerBI会持续加载;
  • 优先使用PowerBI的DirectQuery模式,直接连接数据库实时查询,无需导入全部数据;
  • 若必须使用导入模式,在Oracle中创建物化视图预计算层级和统计结果,PowerBI读取物化视图可大幅提升加载速度;
  • 检查数据库与PowerBI机器的网络连接,确保低延迟、高稳定性。

内容的提问来源于stack exchange,提问作者codeplex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:24:55