今天开发组同事找到我,说一个简单的层次查询非常慢,业务就是有一个存设备表连接关系的表,从node1连入,从node2连出,现在要找出node2的连出顺序,sql类似于:

SELECT LEVEL ID,
       SYS_CONNECT_BY_PATH(C.FID, '>') PATH,
       C.fid,
       c.fno,
       c.node1_id,
       c.node2_id
  FROM CONN_device C
 START WITH C.FNO = 314
CONNECT BY NOCYCLE((PRIOR NODE2_ID = NODE2_ID)
               AND FNO = 316)
       and NODE1_ID >= 1
       and level = 2;
表结构和索引如下,为了保障公司隐私,定义做了下处理。
create table CONN_device
(
  FID  NUMBER(10) not null,
  FNO  NUMBER(5) not null,
  NODE1_ID NUMBER(10),
  NODE2_ID NUMBER(10)
);
BITIDX_CONN314316_FNO 是FNO的索引
BITIDX_CONN314316_NODE2 是NODE2_ID的索引
       
用10046 trace出来的内容(等了好一会):
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch      764    849.28     850.34        214    6199353          0       11446
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      766    849.28     850.35        214    6199353          0       11446
       
Rows     Row Source Operation
-------  ---------------------------------------------------
  11446  CONNECT BY WITH FILTERING (cr=6199353 pr=214 pw=0 time=852238260 us)
  38549   TABLE ACCESS BY INDEX ROWID CONN314316 (cr=123 pr=0 pw=0 time=38623 us)
  38549    BITMAP CONVERSION TO ROWIDS (cr=3 pr=0 pw=0 time=63 us)
      2     BITMAP INDEX FAST FULL SCAN BITIDX_CONN314316_FNO (cr=3 pr=0 pw=0 time=50 us)(object id 137347)
50661964   NESTED LOOPS  (cr=6199230 pr=214 pw=0 time=2178484091 us)
  40137     BUFFER SORT (cr=0 pr=0 pw=0 time=93254 us)
  40137      CONNECT BY PUMP  (cr=0 pr=0 pw=0 time=28 us)
50661964    FILTER  (cr=6199230 pr=214 pw=0 time=227928248 us)
50661964     TABLE ACCESS BY INDEX ROWID CONN314316 (cr=6199230 pr=214 pw=0 time=227783163 us)
1068789015      INDEX RANGE SCAN BITIDX_CONN314316_NODE2 (cr=1980040 pr=82 pw=0 time=587199 us)(object id 137349)
      0   TABLE ACCESS FULL CONN314316 (cr=0 pr=0 pw=0 time=0 us)

上面的计划看返回行数最大的那个1068789015,connect by原理是记录之间自关联,所以我怀疑是NODE2有大量重复数据。
select count(1) from CONN314316;--872342

select count(1) from CONN314316 where NODE2_ID=0;--454805

果然命中,罪魁祸NODE2_ID=0的记录。与开发沟通,按照业务来说,NODE2_ID=0可以不用管,那改起来就方便了,执行后不到1s:

SELECT LEVEL ID,
       SYS_CONNECT_BY_PATH(C.FID, '>') PATH,
       C.fid,
       c.fno,
       c.node1_id,
       c.node2_id
  FROM CONN_device C
 START WITH (C.FNO = 314 and NODE2_ID<>0)
CONNECT BY NOCYCLE((PRIOR NODE2_ID = NODE2_ID)
               AND FNO = 316)
       and NODE1_ID >= 1
       and level = 2;

oracle层次查询的陷阱的更多相关文章

  1. Oracle层次查询

    Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...

  2. 带您了解Oracle层次查询

    http://database.51cto.com/art/201010/231539.htm Oracle层次查询(connect by )是结构化查询中用到的,下面就为您介绍Oracle层次查询的 ...

  3. Oracle 层次查询 connect by

      oracle 层次查询 语法:       SELECT ... FROM            [WHERE condition]                             --过 ...

  4. 【转载】Oracle层次查询和分析函数

    摘要 一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的数?知道一个大的号段范围和已经取过的号段,如何求出可用的号段?利用Oracle提供的强大的查 ...

  5. Oracle层次查询和分析函数在号段选取中的应用

    转自:http://www.itpub.net/thread-719692-1-1.html 摘要一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的 ...

  6. Oracle - 层次查询

    如果表中含有层次数据,可以通过使用层次查询有序地查看层次数据. 语法: condition:指一个或多个表达式和逻辑(布尔)运算符的组合,并返回TRUE.FALSE或UNKNOWNstart with ...

  7. Oracle层次查询start with connect by

    博客参考:https://www.cnblogs.com/jerryxing/articles/2339352.html start with connect by 层次查询(Hierarchical ...

  8. 【转】 oracle 层次查询判断叶子和根节点

    Oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下: DROP TABLE idb_hierarchical; create TABLE idb_hierarchical ...

  9. Oracle层次查询和with函数的使用

    开发中大家应该都做过什么类似部门管理这样的功能,一般情况下一个部门下面还有下一级部门(子部门),这个层级就类似一棵树.这种情况下一般会把父级部门和子级部门分成2个或者多个表,这种算是比较常规的做法:有 ...

随机推荐

  1. 利用 js 实现弹出蒙板(model)功能

    关于 js 实现一个简单的蒙板功能(model) 思路: 创建一个蒙板, 设置蒙板的堆叠顺序保证能将其它元素盖住 position: absolute; top: 0; left: 0; displa ...

  2. 在C#中使用GDAL创建Shape文件

    这几天在项目中考虑使用GDAL,由于10年没有用过VC了,就在网上搜了下怎么样在C# 中使用GDAL,看到了http://blog.csdn.net/liminlu0314/article/detai ...

  3. 802.11 wireless 三

    802.11 wireless 3watts,milliwatts,and Decibels瓦特(功率单位)的定义是1焦耳/秒微波炉1000瓦特,手机100-200毫瓦 decibels(分贝:比较能 ...

  4. 【BZOJ】【1011】【HNOI2008】遥远的行星

    神奇的思路题QAQ 玛雅看到这题我就醉了,什么玩意……5%的误差?果断膜拜@ydc神犇的题解: 就是因为不清楚如何应用那个答案误差不超过5%啦. 从没见过这么诡异的题一下就懵了,问到了方法之后都还半信 ...

  5. short-path problem (Floyd) 分类: ACM TYPE 2014-09-01 23:58 100人阅读 评论(0) 收藏

    #include <cstdio> #include <iostream> #include <cstring> using namespace std; cons ...

  6. Java获取项目中的路径 分类: Java Game 2014-08-14 10:17 122人阅读 评论(0) 收藏

    在项目中经常需要获取某个文件的路径: 在这里提供一些获取路径的方法.. 1.此种方式获取的路径,是当前类所在的路径: UserDAOTest.class.getResource("UserD ...

  7. shiro中unauthorizedUrl不起作用

    解决方法: 在shiro配置文件中添加(异常全路径做key,错误页面做value) <bean class="org.springframework.web.servlet.handl ...

  8. Samy XSS Worm之源码讲解

    说到Web安全和XSS跨站脚本技术,几乎所有的书都会提到Samy Worm,这是在2005年感染了mySpace社交网络上百万用户的蠕虫.正如Morris蠕虫是互联网第一个蠕虫, Samy Worm则 ...

  9. PHP第一课:开发环境配置

    最近在学php,大概了解了一下php的语法结构,以及一些php及基础的知识.由此想到了要亲手试一试:以为以前是学java的用的  ide是myeclipse,所以对eclipse软件布局有特别的钟爱. ...

  10. React Native 简介:用 JavaScript 搭建 iOS 应用 (1)

    [编者按]本篇文章的作者是 Joyce Echessa--渥合数位服务创办人,毕业于台湾大学,近年来专注于协助客户进行 App 软体以及网站开发.本篇文章中,作者介绍通过 React Native 框 ...