楼主: wolfop

还是查询优化的问题,可能有点怪

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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#
发表于 2021-7-18 03:32 | 只看该作者
不用LATERAL, 用传统的CONNECT BY写法:

insert into range_result2
with b as (
select b.*,trunc(start_id/10000)+level-1 as compare_id
  from range_b b
connect by start_id=prior start_id and end_id=prior end_id
     and level<=trunc(end_id/10000)-trunc(start_id/10000)+1
     and prior sys_guid() is not null
)
select a.id,b.type from range_a a,b where trunc(a.id/10000)=b.compare_id and a.id between b.start_id and b.end_id
;

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
22#
发表于 2021-7-18 07:08 | 只看该作者
此外,关于外层表的列值只能向标量子查询传递一层这个限制,在10g的某个版本曾经是解除了的,但是后续的版本又再加上了,直到12c才放开。我曾经在asktom看到有人提问,TOM说这是ANSI标准,如果放开了就是一个bug。也不知道为什么ANSI标准要加这个限制。

使用道具 举报

回复
论坛徽章:
0
23#
发表于 2021-7-18 08:09 来自手机 | 只看该作者
Loop A and then loop B it is about 0.4*10**9 in total.  Loop B and then using index range scan for A it is about 2000 plus some index search in total.  So I would bid hint ordered, from B, A.

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
24#
发表于 2021-7-18 08:11 | 只看该作者
jihuyao 发表于 2021-7-18 08:09
Loop A and then loop B it is about 0.4*10**9 in total.  Loop B and then using index range scan for A ...

写一个来试试看?

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
25#
发表于 2021-7-18 08:28 | 只看该作者
ASKTOM上关于相关子查询嵌套层数的讨论贴:
https://asktom.oracle.com/pls/ap ... 1859169400346361423

2013年TOM还说这是一个bug, 到2016年Connor McDonald终于承认这是一个improvement

使用道具 举报

回复
论坛徽章:
2
20周年集字徽章-周
日期:2023-08-03 16:37:4519周年集字徽章-19
日期:2024-09-07 21:32:18
26#
发表于 2021-7-18 10:49 来自手机 | 只看该作者
苏大师这SQL功力,实在是厉害!佩服佩服!

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
27#
发表于 2021-7-18 20:35 | 只看该作者
jihuyao 发表于 2021-7-18 08:09
Loop A and then loop B it is about 0.4*10**9 in total.  Loop B and then using index range scan for A ...

你的想法非常好!我那些复杂做法原来都是想太多了,哈哈。

create index a_idx on range_a(id );


insert into range_result
SELECT /*+ use_nl(b a)*/ ID, TYPE
FROM range_a A,range_b B
WHERE A.ID>=B.START_ID AND A.ID<=B.END_ID;

111824 rows created.

Elapsed: 00:00:00.08

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
28#
发表于 2021-7-20 09:30 | 只看该作者
没数据,没版本信息,很难印证楼主的想法,

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
29#
发表于 2021-7-20 09:33 | 只看该作者
以B表的范围分区来作驱动,去对比A表的ID,不知效果如何?

使用道具 举报

回复
论坛徽章:
2
20周年集字徽章-周
日期:2023-08-03 16:37:4519周年集字徽章-19
日期:2024-09-07 21:32:18
30#
发表于 2021-7-20 19:55 | 只看该作者
newkid 发表于 2021-7-18 20:35
你的想法非常好!我那些复杂做法原来都是想太多了,哈哈。create index a_idx on range_a(id );insert into ...

这个数据量用这个写法确实非常简单高效, 如果range_b表的数据量达到几百万(比如IP地址库), 这个时候这个写法的效率是不能接受的.

使用道具 举报

回复

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

本版积分规则 发表回复

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