SQL查询效率问题

先生有火吗 2014-06-16 03:30:56
在数据比较多的情况下,使用left join查询与不使用left join,而是把语句拆分,然后再用java对拆分后的语句分别进行查询,最后再拼接结果的方式,哪个快?注;用了top(MSSQL)限制了条数。

比如:

select top 20 a.列,b.列,c.列 from 表 A a left join B b on a.id=b.id left join C c on c.id=a.id;

换成

select top 20 a.列 from A a;
select b.列 from B b where b.id=刚刚取出的A的id;
select c.列 from C c where c.id=刚刚取出的A的id;

哪个好点?
注:数据量很大
...全文
422 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
why_dx 2014-06-24
  • 打赏
  • 举报
回复
为什么不用存储过程呢?直接调用存储过程,不是更快么?
先生有火吗 2014-06-17
  • 打赏
  • 举报
回复
多谢各位热心帮忙 我选择了使用JOIN 方式查询而没有使用java拆分语句查询的方式。 在此特地感谢版主与x_wy46的热心解答!
以学习为目的 2014-06-16
  • 打赏
  • 举报
回复
引用 15 楼 x_wy46 的回复:
我来个去 你按照版主交给你的方法,写两个sql,选中,ctrl+L,直接看开销百分比好了 我是sqlserver2008R2的示例数据库,完全一样 现在我发现很多编程编了很久的人,包括七八年的也有,对于很多东西都是想当然, 我想是这样的,并且告诉别人是这样的,别人不假思索地接受了,然后又告诉了别人, 然后就是以讹传讹就这样……




select * from Person.Person A 
left join Person.PersonPhone B on A.BusinessEntityID=B.BusinessEntityID
where A.BusinessEntityID<100

select * from
(
select * from Person.Person  where BusinessEntityID<100
)t left join Person.PersonPhone B on t.BusinessEntityID=B.BusinessEntityID



支持这种以测试结果为依据的探索
专注or全面 2014-06-16
  • 打赏
  • 举报
回复
对于sql这些函数式语言,一个特点就是,你仅仅告诉他要做什么(what),而不是怎么去做(How) 就比如一个查询 你用java从数组中做一个查询(不说调用系统函数), 你要做的是先循环,然后取出来元素,然后判断是不是你要的元素, 如果是,则输出,如果不是则继续查找,直到遍历完整个数组 这个是你告诉他如何去做的(How) 而sql呢 你执行select* from tableName where name ='***' 事实上你完全没有写循环,没有像遍历数组那样,循环取数据做比对,并且要做到防止遍历数据越界之类的 你只是告诉了他要做什么(What),他就给你出来结果了
专注or全面 2014-06-16
  • 打赏
  • 举报
回复
引用 12 楼 qqq778899123 的回复:
[quote=引用 9 楼 x_wy46 的回复:] 楼主担心的问是不是这样的:从A,B,C三个表连接后取数据,我仅仅取前N条(top N),A,B,C表很大的时候,担心是不是把A,B,C这三个表的数据全部查出来,再给出top N 这个问题我身边也有人有这种感觉,坚持跟我说 这种写法 select * from A inner join B on A.id=B.id where A.name='***' 不如这种写法 select * from (select * from A where A.name='***')t inner join B on A.id=B.id 为他为啥, 他说,我第二种写法先过滤,再跟B表关联 而第一种写法是直接关联再过滤的,我跟他说了半天,又看了执行计划这些,他还是将信将疑 实际上,数据会仅仅取出你topN数据,然后再去管理其他信息 你不用担心这种问题“我只取TOP N,会不会全部给数据弄出来,然后再取出top N”
是啊,我就怕那TOP是先查全部再取其中N条!我觉得整个语句一起执行好些,但是别人却说要分开查询,不然太多join会降低效率,可是这两个查询查询次数不是一样的嘛,整体取还减少了WEB服务器的开销。 你同事估计也是在这看的(http://kxm371.blog.163.com/blog/static/36324566201012344750350/)[/quote]
引用 12 楼 qqq778899123 的回复:
[quote=引用 9 楼 x_wy46 的回复:] 楼主担心的问是不是这样的:从A,B,C三个表连接后取数据,我仅仅取前N条(top N),A,B,C表很大的时候,担心是不是把A,B,C这三个表的数据全部查出来,再给出top N 这个问题我身边也有人有这种感觉,坚持跟我说 这种写法 select * from A inner join B on A.id=B.id where A.name='***' 不如这种写法 select * from (select * from A where A.name='***')t inner join B on A.id=B.id 为他为啥, 他说,我第二种写法先过滤,再跟B表关联 而第一种写法是直接关联再过滤的,我跟他说了半天,又看了执行计划这些,他还是将信将疑 实际上,数据会仅仅取出你topN数据,然后再去管理其他信息 你不用担心这种问题“我只取TOP N,会不会全部给数据弄出来,然后再取出top N”
是啊,我就怕那TOP是先查全部再取其中N条!我觉得整个语句一起执行好些,但是别人却说要分开查询,不然太多join会降低效率,可是这两个查询查询次数不是一样的嘛,整体取还减少了WEB服务器的开销。 你同事估计也是在这看的(http://kxm371.blog.163.com/blog/static/36324566201012344750350/)[/quote] 更加不可思议的是,我们这里有人竟然把你这个链接给出的这种做法写入了开发规范, 为毛没人去质疑,因为他按照“并不是正确的”方法做了,好似乎也没啥问题,于是乎更加没人怀疑了 久而久之就成了“真理”了
专注or全面 2014-06-16
  • 打赏
  • 举报
回复
我来个去
你按照版主交给你的方法,写两个sql,选中,ctrl+L,直接看开销百分比好了
我是sqlserver2008R2的示例数据库,完全一样
现在我发现很多编程编了很久的人,包括七八年的也有,对于很多东西都是想当然,
我想是这样的,并且告诉别人是这样的,别人不假思索地接受了,然后又告诉了别人,
然后就是以讹传讹就这样……




select * from Person.Person A
left join Person.PersonPhone B on A.BusinessEntityID=B.BusinessEntityID
where A.BusinessEntityID<100

select * from
(
select * from Person.Person where BusinessEntityID<100
)t left join Person.PersonPhone B on t.BusinessEntityID=B.BusinessEntityID



KevinLiu 2014-06-16
  • 打赏
  • 举报
回复
应该没什么差别吧。
發糞塗牆 2014-06-16
  • 打赏
  • 举报
回复
top的性能在于WHERE条件,如果查询出来的数据量不大,top不会有什么性能问题
先生有火吗 2014-06-16
  • 打赏
  • 举报
回复
引用 9 楼 x_wy46 的回复:
楼主担心的问是不是这样的:从A,B,C三个表连接后取数据,我仅仅取前N条(top N),A,B,C表很大的时候,担心是不是把A,B,C这三个表的数据全部查出来,再给出top N 这个问题我身边也有人有这种感觉,坚持跟我说 这种写法 select * from A inner join B on A.id=B.id where A.name='***' 不如这种写法 select * from (select * from A where A.name='***')t inner join B on A.id=B.id 为他为啥, 他说,我第二种写法先过滤,再跟B表关联 而第一种写法是直接关联再过滤的,我跟他说了半天,又看了执行计划这些,他还是将信将疑 实际上,数据会仅仅取出你topN数据,然后再去管理其他信息 你不用担心这种问题“我只取TOP N,会不会全部给数据弄出来,然后再取出top N”
是啊,我就怕那TOP是先查全部再取其中N条!我觉得整个语句一起执行好些,但是别人却说要分开查询,不然太多join会降低效率,可是这两个查询查询次数不是一样的嘛,整体取还减少了WEB服务器的开销。 你同事估计也是在这看的(http://kxm371.blog.163.com/blog/static/36324566201012344750350/)
先生有火吗 2014-06-16
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
对于大量数据的查询,建议放到SQL Server端完成,JAVA主要用来展示和逻辑处理。 如果在SQL Server中对比你两个写法的差异,可以把两个写法放到同一个查询界面,ctrl+m,然后同时运行,看看那个图标的百分比,百分比越高,一般效率越差
好的。多谢
专注or全面 2014-06-16
  • 打赏
  • 举报
回复
测试也很简单,你随便弄两张表 select top 20 * from A inner join B on A.id=B.id 然后加大AB表的数据,再次查询一下,看一下IO信息,我不敢说完全一样,但是差别肯定不是跟增加的数据量成比例的
专注or全面 2014-06-16
  • 打赏
  • 举报
回复
楼主担心的问是不是这样的:从A,B,C三个表连接后取数据,我仅仅取前N条(top N),A,B,C表很大的时候,担心是不是把A,B,C这三个表的数据全部查出来,再给出top N 这个问题我身边也有人有这种感觉,坚持跟我说 这种写法 select * from A inner join B on A.id=B.id where A.name='***' 不如这种写法 select * from (select * from A where A.name='***')t inner join B on A.id=B.id 为他为啥, 他说,我第二种写法先过滤,再跟B表关联 而第一种写法是直接关联再过滤的,我跟他说了半天,又看了执行计划这些,他还是将信将疑 实际上,数据会仅仅取出你topN数据,然后再去管理其他信息 你不用担心这种问题“我只取TOP N,会不会全部给数据弄出来,然后再取出top N”
發糞塗牆 2014-06-16
  • 打赏
  • 举报
回复
对于大量数据的查询,建议放到SQL Server端完成,JAVA主要用来展示和逻辑处理。 如果在SQL Server中对比你两个写法的差异,可以把两个写法放到同一个查询界面,ctrl+m,然后同时运行,看看那个图标的百分比,百分比越高,一般效率越差
先生有火吗 2014-06-16
  • 打赏
  • 举报
回复
引用 5 楼 DBA_Huangzj 的回复:
我是说你下面那个查询已经变成了inner join的逻辑。并且你那个最起码是in而不是=吧。
确实是这样。
专注or全面 2014-06-16
  • 打赏
  • 举报
回复
个人觉得放在数据库中直接取想要的结果出来,比你再代码中再来实现关联要好 当然假如你java代码放在web服务器上,数据库单独一个服务器, 直接从数据库中取出单表数据的话,对于数据库来说,代价肯定要小一点 但是这个资源消耗了在web服务器上
發糞塗牆 2014-06-16
  • 打赏
  • 举报
回复
我是说你下面那个查询已经变成了inner join的逻辑。并且你那个最起码是in而不是=吧。
先生有火吗 2014-06-16
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
下面那个应该是inner join了吧
有些数据即使是空的也要返回
先生有火吗 2014-06-16
  • 打赏
  • 举报
回复
引用 1 楼 galenkeny 的回复:
我觉得你最好自己测试下最有说服性
我数据不够多
發糞塗牆 2014-06-16
  • 打赏
  • 举报
回复
下面那个应该是inner join了吧
以学习为目的 2014-06-16
  • 打赏
  • 举报
回复
我觉得你最好自己测试下最有说服性

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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