以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  大小表inner join的where条件效率问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=58781)

--  作者:happyft
--  发布时间:2014/10/23 17:29:00
--  大小表inner join的where条件效率问题
要从两个表中查询加载数据,大表有几十万条记录,小表仅1000条记录。
大小表都有单号,和Name两列,小表此两列的值就是大表中的部份值。

实际就是想加载大表的数据但用小表中的数据来做为条件是否能提高效率?

select * form 大表 a inner join 小表 b on a.单号 = b.单号 where a.Name = \'A\'

select * form 大表 a inner join 小表 b on a.单号 = b.单号 where b.Name = \'A\'

上述两条语句第二条是否效率比第一条高很多?

谢谢

--  作者:有点甜
--  发布时间:2014/10/23 17:58:00
--  

 1、where是在inner join之后,也就是两种表生成以后,再排除不满足条件的值;

 

 2、a.Name 和 b.Name性质不同,因为两者的值肯定是不一样的。


--  作者:HappyFt
--  发布时间:2014/10/23 18:08:00
--  

就是因为大表a中有很多name = A的值,同时小表b中也有Name=A的值,两表通过相同的单号列内联上了,所以我才想用b.name = A取代 a.name = A


实际上我只是要加载大表a的符合条件的数据。如果查询中同时也加入了b.name如下:


select a.*,b.name form 大表 a inner join 小表 b on a.单号 = b.单号 where a.Name = \'A\'

select a.*,b.name form 大表 a inner join 小表 b on a.单号 = b.单号 where b.Name = \'A\'


这样的话是否下面一句速度更快?


--  作者:yinyb36
--  发布时间:2014/10/23 18:53:00
--  

搞那么复杂干啥?

select * form 大表 a where Name = \'A\'

这样不好吗?



--  作者:yinyb36
--  发布时间:2014/10/23 18:54:00
--  
又不用从小表中取值
--  作者:HappyFt
--  发布时间:2014/10/23 20:56:00
--  

因为加载的权限设置在小表中,用它与大表内联筛选出大表中需要的数据加载,主要是on过滤后的数据还要进一步的筛选,纠结where后的字段到底要取哪个表中的比较快,后来测试了下,感觉差不多,但是执行计划显示的却不一样。


--  作者:有点甜
--  发布时间:2014/10/23 20:58:00
--  
 那两句代码执行效率是差不多的,但是最后得到的结果是不一样的,条件不同。
[此贴子已经被作者于2014-10-23 20:58:22编辑过]

--  作者:HappyFt
--  发布时间:2014/10/23 21:07:00
--  

明白了,谢谢!