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 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秒,加上要…… 不是要你的.NET的代码,要你这个查询语句的代码,XXX的谁都答无可答
------解决方案-------------------- 对应海量数据的统计,可以考虑定时统计写入到一个统计表中,查询统计数据直接从统计表中读取数据。
是于如何统计,可以根据实际业务需求,通过数据库中的job,或dev的调度程序实现。
------解决方案-------------------- 引用: 直接贴代码好像不大好,我表达一下意思吧,不是源码。
for(j=1,j<20)
{
BEGIN
select avg() from a left join b on a.id = b.idleft 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
for(i=0,i<5)
{
select count(1) from a left join b on a.id=b.idleft join c on b.id=c.id
where a.id between xxx and xxx and b.ryid=xx and
&n