http://topic.csdn.net/u/20080405/23/d104cd01-1ab9-4ceb-a131-768907a85ae0.html上面一贴可能我说的不够清楚,我重新整理了下,需求如下,请达人帮忙
select top 15 *
from Client
LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory AND CallHistory.IsValid = 1
where 1=1 AND ((Client.FK_Center IN(61) OR CallHistory.FK_Center IN (61)) AND Client.IsValid = 1 ) --or严重影响效率Client --用户表 <100万>
Client.FK_Center --客户所就读的中心
CallHistory --客户访问记录 <80万>
CallHistory.FK_Center --客户访问过的中心(访问和就读的中心可能不一致)
现在的问题就是我想取用户就读的中心编号为61或者访问过中心编号为61的用户
select top 15 *
from Client
LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory AND CallHistory.IsValid = 1
where 1=1 AND ((Client.FK_Center IN(61) OR CallHistory.FK_Center IN (61)) AND Client.IsValid = 1 ) --or严重影响效率Client --用户表 <100万>
Client.FK_Center --客户所就读的中心
CallHistory --客户访问记录 <80万>
CallHistory.FK_Center --客户访问过的中心(访问和就读的中心可能不一致)
现在的问题就是我想取用户就读的中心编号为61或者访问过中心编号为61的用户
LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory
where CallHistory.IsValid = 1 AND Client.IsValid = 1 AND (Client.FK_Center = 61 OR CallHistory.FK_Center = 61)
Client(FK_Center,IsValid)
和CallHistory(FK_Center,IsValid)没有加上试试
(15 行受影响)
表 'CallHistory'。扫描计数 94897,逻辑读取 304029 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Client'。扫描计数 1,逻辑读取 22018 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次
必须在连接之后再对数据做筛选,有什么好的办法解决呢FK_Center是聚集索引
select top 15 client.*
from Client
LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory AND CallHistory.IsValid = 1
where 1=1 AND ((Client.FK_Center IN(61) OR CallHistory.FK_Center IN (61)) AND Client.IsValid = 1 )
--
耗时 10秒表 'CallHistory'。扫描计数 3,逻辑读取 4878 次,物理读取 2 次,预读 4445 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Client'。扫描计数 1,逻辑读取 92 次,物理读取 2 次,预读 18099 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。快了3秒左右,但CallHistory有些字段也是要取的
http://topic.csdn.net/u/20080227/14/8bce0844-bd15-42f0-9cda-a343d5d6601b.html
既然两表采用 或者 的形式,为什么要连接呢?从两表各读出记录,用联合,恐怕效率会高些.
有排序的,但被我省略了,top 15 --以上代码是我分页存储过程拼出的SQL
既然两表采用 或者 的形式,为什么要连接呢? --不连接,怎么找出符合条件的所有学生啊我采用了
select top 15 *
from
(
select * from .... = 61
union
select * from .....=61
)
的方式,发现查询的效率还是很慢,翻一个页面要10多秒,客户不疯,我自己也要疯了,而且这个系统并发率很高,不敢想新建用户的时候会不会超时了。。
select top 15 *
from Client
LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory AND CallHistory.IsValid = 1
where CallHistory.FK_Center IN (61) AND Client.IsValid = 1
union all
select top 15 *
from client
where Client.FK_Center IN(61) and Client.IsValid = 1
另外(1)尽量不要用SELECT *,尽量只返回你需要的字段;(2)把能过滤掉数据越多的条件放在条件语句的越后面;
首先谢谢你的回复,但我发现2个select列数不等,给第二个select加上了连接,速度真的是很快只有2秒了,
但union all会产品重复,改成union发现速度更慢了~~怎么办
有没有好心人有程序员联合开发网的账户和密码
帮我下载以下
不胜感激亚、
邮箱是[email protected]
谢谢亚
select distinct a1,a2,a2
from (
select top 15 *
from Client
LEFT JOIN CallHistory ON CallHistory.PKID = Client.FK_CallHistory AND CallHistory.IsValid = 1
where CallHistory.FK_Center IN (61) AND Client.IsValid = 1
union all
select top 15 *
from client
where Client.FK_Center IN(61) and Client.IsValid = 1
)
查询中不要用union,用union all,大数据量时两者性能差很多。不过有重复,可以考虑用DISTINCT来过滤重复的,不过你要自己比较两种方法的性能