更多
2018年10月26日 11点54分 coldcoder

表A,有列id,name

表B,有列id,action,date


A千万级数据量,表A对表B一对多,B记录A表人某天的动作


情景一:

语句1:select name, date from A join B on a.id=B.id where A.id='110' and B.action='吃饭';

语句2:select name,(select date from B where B.id=A.id and B.action='吃饭') from A where A.id='110';

语句3:select name,date from A join (select id,date from B where B.action='吃饭') B on A.id=B.id where A.id='110';


情景二:

语句1:select name,B.date date1,C.date date2 from A join (select * from B where B.action='吃饭') B on A.id=B.id join (select * from B where B.action='睡觉') C on A.id=C.id where A.id='110';

语句2: select name,case when B.action = '吃饭' then B.date end date1,case when B.action='睡觉' then B.date end date2 from A join B on A.id = B.id where A.id='110';

全部列已加索引,之前优化语句遇到的问题。


求问两种情景下的哪种语句更快?为啥?

修改

Oracle SQL 编程开发语言 修改

修改

应答 (下拉快捷留言)

知道“一起帮”的协助流程么?不要搞错哟:应答握手再远程……

(´・・)ノ(._.`)
还没有内容呢!等待求助被解决(酬谢/撤销)后,求助人或好心人总结……

2018年10月26日 14点56分 --- 第 5 楼 ---

情景1我推荐你换一种写法:

select A.name, B.date from B

join A  on A.id=B.id and A.Id='110'

where B.action='吃饭';


情景二从你的写法上觉的要表述的需求上有歧义


2018年10月26日 14点45分 --- 第 4 楼 ---

--- 回复: ---

我也不会oracle,先查查资料看看吧

https://blog.csdn.net/qq_15766181/article/details/47382083

希望对你有点用

2018年10月26日 14点18分 --- 第 3 楼 ---

--- 回复: ---

如果你会oracle的话,直接远程开工具,profile啊!

性能不是想出来的,得测试啊……

oracle我不会,mysql有explain语句

2018年10月26日 13点34分 --- 第 2 楼 ---

--- 回复: ---

我其实是想问,两种情形下的几种语句,分别哪一种会更快。

情景二没有测试,但是我测试情景一时,语句2远快于语句1,其实本来的写法就是语句1,耗时20s,我改为语句2之后耗时250ms左右,搞不懂了,由此我设想了两种查询情景,分别写了几个test,求解哪个会更快以及为什么。

索引的问题确实遇到过加上索引反而更慢的问题,而且一个索引下添加多列不同排序速度也不一样。

2018年10月26日 13点21分 --- 第 1 楼 ---

情景一快吧:

通常来说,如果语句能够避免子查询的使用,就尽量不用子查询。因为子查询的开销是相当昂贵的

虽然使用索引能得到查询效率的提高,但是也必须注意到它的代价. 索引需要空间来存储,也需要定期维护,  因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。而且表越大,影响越严重。

关键字



帮助

反馈