SQL语句如下:SELECT DISTINCT 
      dbo.out_message.content AS content, dbo.out_message.datime, dbo.out_message.id as id,out_message.a_id, 
      dbo.out_message.type_name, dbo.message_ku.name, dbo.message_ku.state,
      dbo.message_ku.shenhe_name, dbo.message_ku.send_name, 
      case when len(user_pho)=11 then user_pho else substring(dbo.out_message.user_pho,3,11) end as user_pho
FROM dbo.message_ku INNER JOIN
      dbo.out_message ON dbo.message_ku.content = dbo.out_message.content
WHERE (dbo.message_ku.state = '0')
数据近一亿条,请问应该如何修改才能解决超时的问题?

解决方案 »

  1.   

    1 前台增加过滤条件以减少一次显示数据量
    2 增加索引,对于查询中常用的条件字段添加索引
    3 优化查询,这个我不是很专业,猜测假如你用两次查询1 首先根据条件过滤记录只有(select on where) 2 根据记录进行换值处理(select case when),这样也许会快点。
      

  2.   

    使用比较成熟的分页控件,aspnetpager不错,再配合分页存储过程来优化
      

  3.   

    修改客户端的连接超时设置。企业管理器中的设置:
    1.在企业管理器中,选择菜单上的"工具",再选择"选项";
    2.在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;
    3.在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字查询分析器中的设置:
    单击“工具”->"选项"->"连接"; 将登录超时设置为一个较大的数字,连接超时改为0。 查询语句:
    创建\使用合适的索引有可能得话,可以增加内存。
      

  4.   

    就我上面的SQL查询语句,索引要如何建才比较合理呢?
      

  5.   

    能不能用group by 来判断哪些少,哪些多吗?
      

  6.   

    建了索引还是超时,有什么办法吗?
    错误如下:没有访问日志文件的权限!或日志文件只读!RunSqlGetID函数出现错误。
    错误信息:超时时间已到。在操作完成之前超时时间已过或服务器未响应。
    查询语句: select count(1) from viewSend where type_name='广东'
      

  7.   

    请楼主注意你的sql语句本身就存在问题
    你自己说了你是1y条数据
    而你的sql语句会进行表连接,然后每条记录进行比对,同时还要替换字符串,几条数据还没什么,但是你那么大的数据量就肯定不行,所以你需要进行缩减数据量,比如每次只查询20条数据,并且你查询这么多,真正显示到前台被有效使用的有几条了?
      

  8.   

    jimu8130 
    你说得不错
    本来就用不到这些多数据,但是需求中就是要显示这么多数据出来!
    这个程序是以前同事写的.
    我在想,如果把这些数据写进一个名为history表里,再进行查询,不知道还会不会产生这样的问题呢?平时在向这两个表里写进数据时也向history表里写进数据!
    大家让为这样子行不行得通?
      

  9.   

    那就是需求有问题,为了程序更好的运行,也为了用户的体验,我觉得有必要沟通相关人来更改需求,其次我认为可能是你们都理解错了需求,没错上面说需要显示所有满足条件的记录,那我分页显示不行么?显示太多用户看的过来么?你后面说的不知道是不是有点数据缓存的味道,你没说明为什么要弄history这个表
      

  10.   

    就是把SELECT DISTINCT 
          dbo.out_message.content AS content, dbo.out_message.datime, dbo.out_message.id as id,out_message.a_id, 
          dbo.out_message.type_name, dbo.message_ku.name, dbo.message_ku.state, 
          dbo.message_ku.shenhe_name, dbo.message_ku.send_name, 
          case when len(user_pho)=11 then user_pho else substring(dbo.out_message.user_pho,3,11) end as user_pho 
    FROM dbo.message_ku INNER JOIN 
          dbo.out_message ON dbo.message_ku.content = dbo.out_message.content 
    WHERE (dbo.message_ku.state = '0') 查询出来的记录写histroy,以供前台查询这程序是有进行了分页,分页中的数据用视图查询出来
    视图内容就是上面的SQL查询语句
      

  11.   

    既然分页,就应该彻底点,我估计这个人写程序就图个简单,select * from db---》dataset--》datasource=dataset-》采用datagrid或者gridview的默认分页就完了。我觉得你首先应该把这段分页程序改造一下,可以参考网上很多存储过程分页!
      

  12.   

    不说其他的,就说你的问题,超时了把CommandTimeOut设置为0,这个Command就不会执行超时,不过会一直占着资源直到查询结束。
    至于查询优化什么的前面貌似有很多人已经说了。
      

  13.   

    CommandTimeOut=0也试了,最后还是超时了!
      

  14.   

    不知道你的具体应用情况.SELECT DISTINCT 
          dbo.out_message.content AS content, dbo.out_message.datime, dbo.out_message.id as id,out_message.a_id, 
          dbo.out_message.type_name, dbo.message_ku.name, dbo.message_ku.state, 
          dbo.message_ku.shenhe_name, dbo.message_ku.send_name, 
          case when len(user_pho)=11 then user_pho else substring(dbo.out_message.user_pho,3,11) end as user_pho 
    FROM dbo.message_ku INNER JOIN 
          dbo.out_message ON dbo.message_ku.content = dbo.out_message.content 
    WHERE (dbo.message_ku.state = '0') 真是有水平的sql不但用DISTINCT 还有case when len(user_pho)=11 then user_pho else substring(dbo.out_message.user_pho,3,11) end 
    不要说1Y条,我看就是100w条,都够呛.这样的情况,一般根据实际的应用情况采取其他的机制去间接处理.比如如果实时性不高,可以把查询出来的结果,保存存在一个结果表中.页面上的现实直接读结果表.然后根据你们的需要建立sql job 定时更新结果表.另外,这个sql写的,真的让人觉得,在数据量大的情况下,这就是一个根本不可能执行出来的东西..
    尝试,在存储过程中用写循环,临时表之类的方法,去一步一步得到你想用要的结果.这样下来也不至于到超时,或者死锁数据库什么的.在大数据量下直接写和执行这样sql的程序员,应该被枪毙!另外,上面说的什么分页储存过程的人,我看就根本没有仔细看你的sql.也是一些瞎JB扯蛋的家伙.
    估计他们根本不明白也没有做过实际的大数据量的真实操作.那么他们应该更不明白在大数据量下
    有多表关联合查询或者视图下的分页算法了.
      

  15.   

    不知道你的具体应用情况.SELECT DISTINCT 
          dbo.out_message.content AS content, dbo.out_message.datime, dbo.out_message.id as id,out_message.a_id, 
          dbo.out_message.type_name, dbo.message_ku.name, dbo.message_ku.state, 
          dbo.message_ku.shenhe_name, dbo.message_ku.send_name, 
          case when len(user_pho)=11 then user_pho else substring(dbo.out_message.user_pho,3,11) end as user_pho 
    FROM dbo.message_ku INNER JOIN 
          dbo.out_message ON dbo.message_ku.content = dbo.out_message.content 
    WHERE (dbo.message_ku.state = '0') 真是有水平的sql不但用DISTINCT 还有case when len(user_pho)=11 then user_pho else substring(dbo.out_message.user_pho,3,11) end 
    不要说1Y条,我看就是100w条,都够呛.这样的情况,一般根据实际的应用情况采取其他的机制去间接处理.比如如果实时性不高,可以把查询出来的结果,保存存在一个结果表中.页面上的现实直接读结果表.然后根据你们的需要建立sql job 定时更新结果表.另外,这个sql写的,真的让人觉得,在数据量大的情况下,这就是一个根本不可能执行出来的东西..
    尝试,在存储过程中用写循环,临时表之类的方法,去一步一步得到你想用要的结果.这样下来也不至于到超时,或者死锁数据库什么的.在大数据量下直接写和执行这样sql的程序员,应该被枪毙!另外,上面说的什么分页储存过程的人,我看就根本没有仔细看你的sql.也是一些瞎JB扯蛋的家伙.
    估计他们根本不明白也没有做过实际的大数据量的真实操作.那么他们应该更不明白在大数据量下
    有多表关联合查询或者视图下的分页算法了.
      

  16.   

    camelials
    非常谢谢你的提醒
    我的想法也是建一个表,进行更新,相信这样子会快很多
    分页控件没有错,错的是用SQL语句生成
    我马上去改下!
    如果成功马上结了
      

  17.   

    case when len(user_pho)=11 then user_pho else substring(dbo.out_message.user_pho,3,11) end as user_pho  去掉DISTINCT 效率低而且要用分页
      

  18.   

    用了camelials 的方法,查询时间为原来的三分之一
    但时效性不太好,只好写个计划了