sql server 10万条数据 存储过程优化
用存储过程做个统计,一年有十万多的数据。
select count(*)from a, b, c
where a.ID between XXX and XXX
and b.STATUS=1
and a.STATUS='XXX'
and XXXX
and xxxxx
一共五个筛选条件
其中这 “b.STATUS=1” 最耗时间 这条去掉存储过程执行5秒,加上要执行13到15秒
a,b,c 每个表数据十多万,我改了sql 语句 加了索引的都没用,求帮助。
优化的原因是 存储过程执行时间过长,asp.net 连接sql server 时间过长。如果统计的数据量小就没有这个问题,数据量达到大几万就连接超时了。
[解决办法]
1、检查a、b、c三表索引,索引要用在“最能快速筛选数据”的列上,和where子句出现的列上,关联的列上。所以你要检查where条件里面有多少需要加索引的。
2、观察数据的分布,然后把能最快降低数据集的where字段放到前面,假设b.STATUS=1能一下子把数据从1000万降到1万,那在where中,第一个出现的条件应该是b.STATUS=1。
3、count(*)就免了,用count(1)吧。*号需要检查是否已经取完了3个表的所有列,有额外的开销。
4、你的这3个表好像没有关联条件,也就是成了cross join,会造成数以亿计的数据量。
5、10几秒就超时的话你的前端程序超时设置设的太短了。
[解决办法]
select b.sj-c.sj Sj,count(1) cnt
from a
left join b on a.id=b.id
left join c on b.id=c.id
where a.id between xxx and xxx and b.ryid=xx and
b.zt=xxx and c.CS=1
group by b.sj-c.sj