full join 执行非常慢

litsand 2012-06-19 04:28:43
用left join 很快就可以出来查询的数据。
但是改成full join 就很慢。等个十几分钟都执行不完。不知道是数据库还是查询语句的问题。oracle的数据库。
希望大家能给点建议。

有必要的话我可以把查询语句贴出来。
...全文
573 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
只是A B 表的地区都是11的子集,不一定刚好有11地区都有。


可以以构造的所有地区为左表 来关联数据 不一定非要用full join 关联出来的大半数据都多余的 没必要了..
litsand 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

或者 LZ列举下表结构 举几条数据 想要什么结果 这样看起来直观一点 可能没想象的那么复杂呢
[/Quote]

()A full join ()B on ...

因为A表单独查只有10条数据,B表也只有10条,然后 full join 就一直执行。。因为对这个不熟,就觉得这个不合逻辑,也没有其他的什么思路。就理解不了了。

但是(~~~~~~~) A ~~~~~~~执行可能要检索几十万数据吧。就是不知道可能的错误点会在哪里。
  • 打赏
  • 举报
回复
或者 LZ列举下表结构 举几条数据 想要什么结果 这样看起来直观一点 可能没想象的那么复杂呢
litsand 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

LZ指的少量 是多少? 1000? 如果A、B表都算1000的数据 full join连接 堆起来就是1000*1000的数据 还会怎么快呢?
[/Quote]
单独查 AB 只有10条左右的数据了。对这个语法不是很了解,A 和 B 也不是我写的,只是为了方便想综合一下,不知道是不是嵌套太多,有歧义什么的,如果仅仅是10*10,应该没什么问题,而full join 换成left join,可以正确执行。我想达到的效果是是A表中对应地区的num加上B表中对应地区的num,不知道有什么好的办法。总共的地区一共有11个,只是A B 表的地区都是11的子集,不一定刚好有11地区都有。


select A.地区,A.num1,B.num2,(A.num1+B.num2) from (select 地区,count(*) as num1 from (select case when IP地址 between 184025089 and 184549375 then
省略。。。。。
else
'其他'
end 地区 from

(select d.serialnumber as 序列号,

省略。。。。'yyyy-mm-dd hh24:mi:ss') as 最后激活时间

from device d

left join devicepreconfig dp on d.serialnumber = dp.serial_number

where (dp.rgtype = 0 or dp.rgtype = 1) and d.deleted = 0

) tb ) group by 地区) A


left join

(select 地区,count(*) as num1 from (select case when IP地址 between 184025123 and 1845493455 then
省略。。。。。
else
'其他'
end 地区 from

(select d.serialnumber as 序列号,

省略。。。。'yyyy-mm-dd hh24:mi:ss') as 最后激活时间

from device d

left join devicepreconfig dp on d.serialnumber = dp.serial_number

where (dp.rgtype = 0 or dp.rgtype = 1) and d.deleted = 0

) tb ) group by 地区) B


on A.地区=B.地区
zhjj1234 2012-06-21
  • 打赏
  • 举报
回复
笛卡尔积了,这样的数据有用吗
槑党--一缕风 2012-06-21
  • 打赏
  • 举报
回复
可以先根据条件进行过滤 然后再进行你需要的蛮连接查询
槑党--一缕风 2012-06-21
  • 打赏
  • 举报
回复
full join 是满连接 速度肯定要慢很多,数据越多越慢。
两个表都是10000条数据 那么就是10000*10000

  • 打赏
  • 举报
回复
LZ指的少量 是多少? 1000? 如果A、B表都算1000的数据 full join连接 堆起来就是1000*1000的数据 还会怎么快呢?
litsand 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

应该是,你的连接条件,致使大量出现了,一对多,多对一,这样的结果集了啊。
[/Quote]

非常感谢。我觉得也是很有这个可能,只是我查的表是这样子的 (select *........) A full join (select *......) B 查出来的A 和 B 都是很少的数据量了。只是得到 A 和 B 的时候查询的数据量比较大。这个执行的时候 是先 查出来 A 和 B 然后 full join 匹配的话,按照我的理解不会很慢。
litsand 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

只是A B 表的地区都是11的子集,不一定刚好有11地区都有。


可以以构造的所有地区为左表 来关联数据 不一定非要用full join 关联出来的大半数据都多余的 没必要了..
[/Quote]

非常感谢。
jdsnhan 2012-06-21
  • 打赏
  • 举报
回复
full join本来执行就慢
yinan9 2012-06-20
  • 打赏
  • 举报
回复
full join速度慢 是正常的。
如果不是需求必要,使用其他方法看看
阿冷 2012-06-20
  • 打赏
  • 举报
回复
应该是,你的连接条件,致使大量出现了,一对多,多对一,这样的结果集了啊。
  • 打赏
  • 举报
回复
数据大概多少? 应该有其他方式查询

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧