0 0

oracle 根据树形结构查询一级,二级报表sql 优化问题15

问题是:当出现数据量特别大的时候,sql该如何优化,谢谢。
select t.cate_1_id,
       max(t.supplier_count),
       max(t.supplier_t_count),
       max(t.supplier_a_count),
       max(t_rate),
       max(a_rate),
       max(t.vcode_count),
       max(vcode_rate),
       max(t.supplier_l_count),
       max(l_rate),
       max(t.supplier_b_count),
       max(b_rate),
       max(t.examiner),
       (select asset.name
          from assetcategory asset
         where asset.categoryid = t.cate_1_id),
       max(t.category_name) as category_name,
       max(t.parentcategoryid) as parentCode
  from (with supplier_cnt as 
  (select count(cate_1_id) as cnt, cate_1_id
                                from (select distinct decode(get_latest_parent_bysubid(sp.prodtype_id),
                                                             null,
                                                             sp.prodtype_id,
                                                             get_latest_parent_bysubid(sp.prodtype_id)) cate_1_id,
                                                      sp.supplier_id
                                        from t_rsp_supplier_basis sb
                                        left join t_rsp_supplier_prodtype sp
                                          on sb.supplier_id = sp.supplier_id
                                        left join user_ u
                                          on sb.user_id = u.userid
                                       where 1 = 1) t
                               group by t.cate_1_id), supplier_status_cnt as (select count(cate_1_id) as cnt,
                                                                                     cate_1_id as prodtype_id,
                                                                                     manage_status
                                                                                from (select distinct decode(get_latest_parent_bysubid(sp.prodtype_id),
                                                                                                             null,
                                                                                                             sp.prodtype_id,
                                                                                                             get_latest_parent_bysubid(sp.prodtype_id)) cate_1_id,
                                                                                                      sp.supplier_id,
                                                                                                      sb.manage_status
                                                                                        from t_rsp_supplier_basis sb
                                                                                        left join t_rsp_supplier_prodtype sp
                                                                                          on sb.supplier_id =
                                                                                             sp.supplier_id
                                                                                        left join user_ u
                                                                                          on sb.user_id =
                                                                                             u.userid
                                                                                       where 1 = 1) t
                                                                               group by t.cate_1_id,
                                                                                        t.manage_status), vcode_cnt as (select count(cate_1_id) as cnt,
                                                                                                                               cate_1_id as prodtype_id
                                                                                                                          from (select distinct decode(get_latest_parent_bysubid(sp.prodtype_id),
                                                                                                                                                       null,
                                                                                                                                                       sp.prodtype_id,
                                                                                                                                                       get_latest_parent_bysubid(sp.prodtype_id)) cate_1_id,
                                                                                                                                                sp.supplier_id
                                                                                                                                  from t_rsp_supplier_basis sb
                                                                                                                                  left join t_rsp_supplier_prodtype sp
                                                                                                                                    on sb.supplier_id =
                                                                                                                                       sp.supplier_id
                                                                                                                                  left join user_ u
                                                                                                                                    on sb.user_id =
                                                                                                                                       u.userid
                                                                                                                                 where 1 = 1
                                                                                                                                   and sb.vcode is not null
                                                                                                                                   and sp.prodtype_id is not null) t
                                                                                                                         group by t.cate_1_id)
         select decode(get_latest_parent_bysubid(ac.categoryid),
                       null,
                       ac.categoryid,
                       get_latest_parent_bysubid(ac.categoryid)) as category_2nd_code,
                max(sp_cnt.cnt) as supplier_count,
                max(sps_cnt_t.cnt) as supplier_t_count,
                max(sps_cnt_a.cnt) as supplier_a_count,
                decode(max(sp_cnt.cnt),
                       0,
                       '',
                       round((max(sps_cnt_t.cnt) / max(sp_cnt.cnt)) * 100, 2) || '%') as t_rate,
                decode(max(sp_cnt.cnt),
                       0,
                       '',
                       (round((max(sps_cnt_a.cnt) / max(sp_cnt.cnt)) * 100, 2)) || '%') as a_rate,
                max(v_cnt.cnt) as vcode_count,
                decode(max(sp_cnt.cnt),
                       0,
                       '',
                       (round((max(v_cnt.cnt) / max(sp_cnt.cnt)) * 100, 2)) || '%') as vcode_rate,
                max(sps_cnt_l.cnt) as supplier_l_count,
                decode(max(sp_cnt.cnt),
                       0,
                       '',
                       round((max(sps_cnt_l.cnt) / max(sp_cnt.cnt)) * 100, 2) || '%') as l_rate,
                max(sps_cnt_b.cnt) as supplier_b_count,
                decode(max(sp_cnt.cnt),
                       0,
                       '',
                       round((max(sps_cnt_b.cnt) / max(sp_cnt.cnt)) * 100, 2) || '%') as b_rate,
                get_examiner_by_prodtype(ac.categoryid, 11419) as examiner,
                max(ac.name),
                getassetcategory2(ac.categoryid) as category_name,
                ac.categoryid,
                max(ac.parentcategoryid) as parentcategoryid,
                sp_cnt.cate_1_id
           from ASSETCATEGORY ac
           left join T_RSP_SUPPLIER_PRODTYPE rsp
             on ac.categoryid = rsp.prodtype_id
           left join T_RSP_SUPPLIER_BASIS sb
             on rsp.supplier_id = sb.supplier_id
           left join user_ u
             on sb.user_id = u.userid
           left join supplier_cnt sp_cnt
             on sp_cnt.cate_1_id =
                decode(get_latest_parent_bysubid(ac.categoryid),
                       null,
                       ac.categoryid,
                       get_latest_parent_bysubid(ac.categoryid))
           left join supplier_status_cnt sps_cnt_t
             on (sps_cnt_t.prodtype_id =
                decode(get_latest_parent_bysubid(ac.categoryid),
                        null,
                        ac.categoryid,
                        get_latest_parent_bysubid(ac.categoryid)) and
                sps_cnt_t.manage_status = 'T')
           left join supplier_status_cnt sps_cnt_a
             on (sps_cnt_a.prodtype_id =
                decode(get_latest_parent_bysubid(ac.categoryid),
                        null,
                        ac.categoryid,
                        get_latest_parent_bysubid(ac.categoryid)) and
                sps_cnt_a.manage_status = 'A')
           left join supplier_status_cnt sps_cnt_l
             on (sps_cnt_l.prodtype_id =
                decode(get_latest_parent_bysubid(ac.categoryid),
                        null,
                        ac.categoryid,
                        get_latest_parent_bysubid(ac.categoryid)) and
                sps_cnt_l.manage_status = 'L')
           left join supplier_status_cnt sps_cnt_b
             on (sps_cnt_b.prodtype_id =
                decode(get_latest_parent_bysubid(ac.categoryid),
                        null,
                        ac.categoryid,
                        get_latest_parent_bysubid(ac.categoryid)) and
                sps_cnt_b.manage_status = 'B')
           left join vcode_cnt v_cnt
             on v_cnt.prodtype_id =
                decode(get_latest_parent_bysubid(ac.categoryid),
                       null,
                       ac.categoryid,
                       get_latest_parent_bysubid(ac.categoryid))
          where ac.categoryid not in
                (select a.parentcategoryid from ASSETCATEGORY a)
          group by sp_cnt.cate_1_id,
                   ac.categoryid) t
          group by t.cate_1_id


其中get_latest_parent_bysubid(ac.categoryid) 是根据子节点获得所有一级节点。同时,也有数据是本身就是一级节点且无子节点。
 
2014年7月09日 14:36

1个答案 按时间排序 按投票排序

0 0

采纳的答案

1、不建议用如此复杂的sql语句。因为这样不利于阅读及维护。建议拆分成多条语句或写一个存储过程;
2、较靠前的查询条件应该会先执行,在较靠前的查询中过滤掉尽可能多的无用数据,这样后面的查询需要处理的数据量较小,自然就提升了速度;
3、注意left join,right join和inner join的区别。

时间和使用机器的关系无法给你仔细分析具体语句,大概提这三点意见供你参考吧。

2014年7月16日 14:43

相关推荐

    Oralce高级查询与资料

    通过指定起始点和连接条件,你可以遍历整个树形结构,获取层次关系的信息。 七、索引与性能优化 索引是提高查询速度的关键。Oracle支持多种类型的索引,如B树索引、位图索引、函数索引等。理解何时创建和使用索引,...

    OracleEBS开发汇总文档

    - **方法**: 在Form中构建树形结构的数据展示。 - **应用场景**: 复杂层级关系的数据管理。 28. **遍历数据块** - **方法**: 通过循环遍历数据块中的每一项。 - **应用场景**: 数据处理或分析。 29. **LOV动态...

    Oracle专题培训.doc

    层次查询用于处理树形或分层数据,如组织结构或产品类别,通过CONNECT BY子句实现。 九、自治事务 自治事务是嵌套在主事务中的独立事务,有自己的提交和回滚能力,不影响外部事务的状态。 这些Oracle专题培训的...

    toad中文教程+图解教程

    3. **对象浏览器**:Toad提供了一个直观的树形结构,用于查看和管理数据库中的表、视图、存储过程、函数、索引、触发器等各种对象。 4. **查询编辑器**:这是Toad的核心功能之一,支持编写SQL语句,进行数据查询、...

    rave5.1控件

    此外,它还支持分页、合并单元格、树形结构显示等高级功能,便于用户在复杂的数据环境中操作。 2. **报表设计**:Rave 5.1的报表设计功能强大,支持多种类型的报表,如列表、表格、图表、交叉表等。用户可以利用...

    plsql中文使用说明

    - 浏览器提供了一个树形结构来展示数据库对象。 - 可以展开节点查看具体对象的详细信息。 ##### 15.2 浏览器过滤器 - 通过过滤器可以隐藏不关心的对象类型。 - 例如,只显示表而不显示视图。 ##### 15.3 浏览器...

    C#程序开发范例宝典(第2版).part13

    实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 实例024 控件随窗体自动调整 25 实例025 带分隔栏的窗体 25 ...

    java编程JDBC数据库编程1数据库基础.docx

    - **层次模型**:以树形结构表示数据,只有一个根节点。 - **网状模型**:呈现出交叉关系的网络结构,允许多个从属关系。 - **关系模型(Relational Model)**:最常用的数据模型,数据以二维表格形式表示。 - *...

    C#编程经验技巧宝典

    52 <br>0069 求最大公约数 52 <br>0070 求最小公倍数 53 <br>0071 判断素数的算法 53 <br>0072 如何判断一个数是否是完数 54 <br>0073 歌德巴赫猜想的算法 54 <br>0074 八皇后问题 ...

    Maximo EAM平台开发笔记2

    **2.1 显示树形结构** - **实现方法**: 1. 在Maximo中创建或编辑对象时,使用树形结构控件。 2. 设置控件属性,如根节点、节点展开行为等。 **2.2 屏蔽工作流发送界面上的“重新分配”按钮** - **实现步骤**: ...

    powerbuilder 培训讲义

    - **TreeView**:用于展示树形结构的数据。 #### 五、PowerBuilder数据窗口操作 - **数据窗口概述**: - 数据窗口是PowerBuilder的核心组件之一,用于显示、编辑和操作数据。 - 包括数据窗口画笔、数据窗口分类...

    JAVA上百实例源码以及开源项目源代码

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

Global site tag (gtag.js) - Google Analytics