123
返回列表 发新帖
楼主: newkid

[精华] 利用递归WITH子查询进行优化的实例

[复制链接]
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
21#
 楼主| 发表于 2011-6-18 04:28 | 只看该作者
原帖由 newkid 于 2011-6-17 23:32 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=17886661&ptid=1447451][img]http://你这方法相当于自己发明了一个索引,但是我不知道你打算如何维护,是放到事务?那么就有并发问题;每天维护一次?那就不能实时提供数据。

想了一下,每天维护一次就可以,最近的MAXID可以为空。

使用道具 举报

回复
论坛徽章:
41
2010广州亚运会纪念徽章:橄榄球
日期:2011-01-11 06:17:26红孩儿
日期:2012-12-19 11:07:13玉石琵琶
日期:2012-12-19 11:07:13九尾狐狸
日期:2012-12-19 11:07:13嫦娥
日期:2012-12-19 11:07:13玉兔
日期:2012-12-19 11:07:13紫蜘蛛
日期:2012-12-19 11:07:13蓝色妖姬
日期:2012-12-19 11:07:13紫蛋头
日期:2013-01-23 09:04:49SQL大赛参与纪念
日期:2013-12-06 14:03:45
22#
发表于 2011-6-18 05:01 | 只看该作者

回复 #17 lastwinner 的帖子

aha, this is one of the tricky ways I have done before.

使用道具 举报

回复
论坛徽章:
2
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:51咸鸭蛋
日期:2012-03-21 09:44:03
23#
发表于 2011-6-18 05:56 | 只看该作者
ORACLE这个递归WITH语句是个新功能但确实有很多用处,不过第一次看到的话也有点难理解。在网上看到Jonathan在03年写的一个关于这种用法的说明尽管那时ORACLE还没有这个功能,没明白newkid的SQL如何实现循环的可以看看
Understand Recursive With Clause.doc (58 KB, 下载次数: 91)

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
24#
发表于 2011-6-18 17:32 | 只看该作者
原帖由 newkid 于 11-6-18 04:28 发表

想了一下,每天维护一次就可以,最近的MAXID可以为空。



对啊,这个东西是无所谓的,一天甚至一周维护一次都行,搞个job每天跑一次就行了

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
25#
发表于 2011-6-18 17:32 | 只看该作者
原帖由 xqmei 于 11-6-18 05:01 发表
aha, this is one of the tricky ways I have done before.


Let's

使用道具 举报

回复
求职 : .Net研发
招聘 : 软件工程师
论坛徽章:
42
生肖徽章2007版:蛇
日期:2009-03-09 22:52:56鲜花蛋
日期:2013-07-04 08:42:23鲜花蛋
日期:2013-07-24 15:38:37技术图书徽章
日期:2013-09-23 12:41:04ITPUB社区12周年站庆徽章
日期:2013-10-08 14:53:15ITPUB社区12周年站庆徽章
日期:2013-10-08 14:56:35ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB社区12周年站庆徽章
日期:2013-10-08 15:00:34红宝石
日期:2014-01-02 12:56:14大众
日期:2014-01-02 13:20:19
26#
发表于 2011-8-23 15:47 | 只看该作者
又要做技术了,Mark 一下

使用道具 举报

回复
论坛徽章:
15
奥运会纪念徽章:击剑
日期:2008-07-17 14:58:53懒羊羊
日期:2015-03-04 14:52:11马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:152012新春纪念徽章
日期:2012-01-04 11:53:54ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262011新春纪念徽章
日期:2011-02-18 11:42:472011新春纪念徽章
日期:2011-01-04 10:35:17ITPUB9周年纪念徽章
日期:2010-10-08 09:34:01
27#
发表于 2011-11-22 15:08 | 只看该作者
佩服

使用道具 举报

回复
论坛徽章:
14
兰博基尼
日期:2013-12-09 18:17:40生肖徽章:猪
日期:2013-12-06 14:15:45生肖徽章:狗
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:鼠
日期:2013-12-06 14:15:45
28#
发表于 2011-12-2 18:26 | 只看该作者
Very inspiring! Wrote a similar one.
  1. WITH maxid AS (SELECT MAX(item_id) item_id FROM items),
  2. t (id, next_id) AS (
  3. SELECT item_id, item_id
  4.   FROM maxid
  5. UNION ALL
  6. SELECT i.item_id,
  7.        (SELECT MAX(item_id)
  8.           FROM items
  9.          WHERE item_id <= i.item_id - 2000)
  10.   FROM t, items i
  11. WHERE i.item_id = t.next_id
  12.    AND i.created_date >= TRUNC(SYSDATE) - 2
  13. )
  14. SELECT *
  15. FROM items
  16. WHERE item_id >= (SELECT min(next_id) from t)  
  17.   AND item_type = 14
  18.   AND created_date >= TRUNC(SYSDATE) - 2;
复制代码

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
29#
 楼主| 发表于 2011-12-2 23:58 | 只看该作者
jazovo 发表于 2011-12-2 18:26
Very inspiring! Wrote a similar one.

这个写法更简单,因为主键基本上是按1递增的,没有必要像我那样用ROWNUM限制行数。
从老兄在asktom上的贴一看就身手不凡,以后常来玩!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表