为什么分开查询(非子查询)比join还快?

wyc9296 2017-09-19 11:19:00
公司的电脑不能装oracle 8可视化软件,所以看不了计划开销,好坑…
最近搭了一个网页,获取用户输入(product_name,material,deliver),然后查询oracle。

用的是perl/php里面的数据库模块,其中的sql是这样的:
select p.product_name, d.material, d.deliver, o.supervisor from operator o, detail d, product p where o.operator_id =d.operator_id and o.product_id=p.product_id and p.product_name in (用户输入的两百多个product) and d.material ='用户输入' and d.deliver='用户输入'

其中operator,detail都是百万级的表,product会小一些。operator>detail>>product。

事实上这样的代码运行需要1分钟;但是如果用perl/php分开运行,先得到product_id,再通过它得到operator_id,最后得到对应的supervisor,会快很多,只要5秒钟。因为怕数据库缓存查询数据,运行完了我等了很久再运行第二次的,时间上应该不会有问题。
...全文
411 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
minsic78 2017-09-26
  • 打赏
  • 举报
回复
无非直接join可能用了hash join,分开就是多个nested loops叠加,哪种更快,跟实际数据量数据分布都有关系,这种场景这种数据量数据分布下可能是分开来快,换个场景可能就是一次join快了。
灬D伊龙灬 2017-09-26
  • 打赏
  • 举报
回复
感觉直接写上表名,不用join数据会翻倍
碧水幽幽泉 2017-09-26
  • 打赏
  • 举报
回复
分散式执行SQL,缩小扫描的数据,查询速度当然快很多了。
或者你换个SQL试试看:

select p.product_name, d.material, d.deliver, o.supervisor
from operator o
inner join product p on o.product_id = p.product_id and p.product_name in (用户输入的两百多个product)
inner join detail d on o.operator_id = d.operator_id and d.material = '用户输入' and d.deliver = '用户输入'

碧水幽幽泉 2017-09-19
  • 打赏
  • 举报
回复
感觉这不是Oracle的问题,是否应该移到Web开发/PHP模块去问?

17,086

社区成员

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

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