DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: liangjiping168
今日帖子: 16
在线用户: 18
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 adongtan (aaabbb) ▲▲▲▲▲ -
普通会员
2021/12/7 15:47:36
标题:
left join ... on 后面表的顺序问题,导致速度差很多. 浏览:1249
加入我的收藏
楼主: 举例:
select * 
from 
table1 a left join table2 b 
----------
on a.userid=b.userid   //查询速度很慢.
----------
on b.userid=a.userid   //查询速度明显快.
----------
其中a是流水表,userid多次重复出现,b是人员信息表,userid只有一个.
a在前和b在前,查询速度差很多!大家有没有遇过这样子情况的?
----------------------------------------------
-
作者:
男 adongtan (aaabbb) ▲▲▲▲▲ -
普通会员
2021/12/7 15:51:22
1楼: 补充,在查询管理器中没有显示差异 .
只在APP里才会慢.unidac控件.
----------------------------------------------
-
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2021/12/7 16:32:08
2楼: 要看A/b表总数,  结构发上来看看. 

select不加where? 什么需求?
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 adongtan (aaabbb) ▲▲▲▲▲ -
普通会员
2021/12/7 16:54:12
3楼: where后面省略了.
sql2008+unidac 8.0
a表几百万条,是消费流水,b表10万条,是会员信息.
----------------------------------------------
-
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2021/12/7 17:31:37
4楼: 语句发全,
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2021/12/8 4:37:32
5楼: 楼主是不是很多年都是只做项目、不学习提高理论水平了呢?凭我8年前做MIS项目的学习记忆,应该是因为a b两表的索引设置不同导致的结果,特别是,很可能a的索引比较复杂,或者没有设置索引,导致每次都要到硬盘上去扫描一遍。而b表就正确设置了索引,常驻内存。从索引这个线索找找原因,估计是因为这个。
----------------------------------------------
只有偏执狂才能生存!
作者:
男 lordaeron (Terry) ★☆☆☆☆ -
禁用账号
2021/12/8 6:42:44
6楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
该账号是个傻逼
作者:
男 ddrfan (若苗瞬) ▲▲▲▲▲ -
普通会员
2021/12/8 9:18:11
7楼: 我觉得楼主的问题很奇怪,
楼上的同学都没认真看题。

1)业务逻辑问题
其中a是流水表,userid多次重复出现,b是人员信息表,userid只有一个。

从楼主的表述看:
应该是b left join a 啊…… 选出所有人员,以及关联流水(即使流水为空)。
如果用a left join b 那么就是选出所有的流水,以及关联人员(即使人员为空)??
当然楼主并没有放真正的SQL,所以不研究了……

2)楼主的问题本身
on a.userid=b.userid   //查询速度很慢.
on b.userid=a.userid   //查询速度明显快.

理论上难道不是这两句话一模一样么,和表的规模,有没有索引没有关系啊。
关键是谁 left join 谁。
因为怕理论知识不够,所以我用Oracle12c试了试,确实a=b,b=a的SQL解释完全一致。

而且楼主也说了,在查询管理器中没有显示差异,只在APP里面慢。

所以我觉得问题可能出在楼主没有贴出来的SQL其它部分上面。
也许其它部分的where条件,像上面各位同学说的,影响了索引使用,取数顺序。
至于APP才慢,我完全不懂了。

最后:【sql2008】 是什么鬼,数据库名字么?
----------------------------------------------
Bye bye DDRFAN...
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS