oracle层次查询的陷阱
今天开发组同事找到我,说一个简单的层次查询非常慢,业务就是有一个存设备表连接关系的表,从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层次查询的陷阱的更多相关文章
- Oracle层次查询
Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...
- 带您了解Oracle层次查询
http://database.51cto.com/art/201010/231539.htm Oracle层次查询(connect by )是结构化查询中用到的,下面就为您介绍Oracle层次查询的 ...
- Oracle 层次查询 connect by
oracle 层次查询 语法: SELECT ... FROM [WHERE condition] --过 ...
- 【转载】Oracle层次查询和分析函数
摘要 一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的数?知道一个大的号段范围和已经取过的号段,如何求出可用的号段?利用Oracle提供的强大的查 ...
- Oracle层次查询和分析函数在号段选取中的应用
转自:http://www.itpub.net/thread-719692-1-1.html 摘要一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的 ...
- Oracle - 层次查询
如果表中含有层次数据,可以通过使用层次查询有序地查看层次数据. 语法: condition:指一个或多个表达式和逻辑(布尔)运算符的组合,并返回TRUE.FALSE或UNKNOWNstart with ...
- Oracle层次查询start with connect by
博客参考:https://www.cnblogs.com/jerryxing/articles/2339352.html start with connect by 层次查询(Hierarchical ...
- 【转】 oracle 层次查询判断叶子和根节点
Oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下: DROP TABLE idb_hierarchical; create TABLE idb_hierarchical ...
- Oracle层次查询和with函数的使用
开发中大家应该都做过什么类似部门管理这样的功能,一般情况下一个部门下面还有下一级部门(子部门),这个层级就类似一棵树.这种情况下一般会把父级部门和子级部门分成2个或者多个表,这种算是比较常规的做法:有 ...
随机推荐
- PHP字符串处理常用方法
strlen("字符串");//取字符串的长度 strcmp($a,$b); //判断两个字符串是否相同,相同返回0,$a>$b返回1,$a<$b返回-1,区分大小写 ...
- Codeforces Round #274 (Div. 2)
A http://codeforces.com/contest/479/problem/A 枚举情况 #include<cstdio> #include<algorithm> ...
- 数据导出为excel表格
---恢复内容开始--- 方式一: 通过request和response中携带的数据导出表格,导出的结果会将页面中展示的内容全部导出.代码如下: //调出保存框,下载页面所有内容 String fil ...
- [工作积累] NDK通过Java获取package name 和version
////////////////////////////////////////////////////////////////////////// //Java code snippet //get ...
- 零成本实现WEB性能测试(一)性能测试基础
1.1 初识性能测试 概念:负载测试&压力测试. 目的:评估系统的能力,识别系统弱点,系统调优,检测问题,验证稳定性. 分类:负载测试,压力测试,容量测试 B/S指标: Avg Rps,平均每 ...
- 1303: [CQOI2009]中位数图
早起一AC,整天萌萌哒. Problem: 1303 User: forgot93 Language: C++ Result: Accepted Time:56 ms Memory:2108 kb * ...
- hadoop-ha QJM架构应用故障总结
部署hadoop-ha QJM架构过程我就不说了,参考 我的博客:hadoop-ha QJM架构部署故障一: namenode 报错日志如下: WARN org.apache.hadoop.hd ...
- CSS预处理器实践之Sass、Less大比拼[转]
什么是CSS预处理器? CSS可以让你做很多事情,但它毕竟是给浏览器认的东西,对开发者来说,Css缺乏很多特性,例如变量.常量以及一些编程语法,代码难易组织和维护.这时Css预处理器就应运而生了.Cs ...
- 简单CSS hack:区分IE6、IE7、IE8、Firefox、Opera
一.跨浏览器的网页设计一直是让人很头疼的问题,这不只是因为浏览器的版本众多,还有一个重要的原因是相同浏览器的不同时期的版本也会有差异,甚至是在不同操作同台上还会有不同.因此使CSS hack技术进行浏 ...
- 如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用?(2)
[编者按]本篇文章作者是 Reinder de Vries,既是一名企业家,也是优秀的程序员,发表多篇应用程序的博客.本篇文章中,作者主要介绍了如何基于 Parse 特点,打造一款类似 Instagr ...