日期:2014-05-17  浏览次数:20396 次

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