因为数据比较多,所以,把数据按月建表存放,比如2月份的放在一张表Table2中,3月份的放在表Table3中.
问题出来了,如以下两种情况:
C1:当我查询2月1号到3月10号的数据是,需要把Table2和Table3使用UNION ALL联合起来,速度还可以,加在一起大概200万条数据,1~2秒钟就出来了.C2:但是,当我只查询3月1号到3月10号的数据的时候,只用到了Table2,查询起来却慢的要死,大概要30~70秒钟的样子.刚开始想到可能是3月份没有数据,但是两次查找结果都显示3月份有要查找的数据,而且两种情况下,查询结果都是正确的.Table2与Table3 不同的是,Table2存放2月份的数据,现在是3月份,因此,不会向Table2表再写入数据,而是会根据情况,实时的向
Table3写数据.
我把Table3导出到另外的服务器上,只查询(没有程序对它做写入操作)再执行C2的时候,速度就很快了.但是C1情况下,也查询了Table3.而且那个时候也有实时数据向这个表中,写入.不知道问题在哪儿?纳闷呀,数据库方面接触也比较久了,从来没有碰到过这样的问题.还请高人指点.

解决方案 »

  1.   

    更正,上面C2情况:是只用到了"Table3表",而不是"只用到了Table2表".而且到现在,Table3表中的数据也只有50万条.
      

  2.   

    更正,上面C2情况:是 只用到了 Table3表  ,而不是 只用到了Table2表 而且到现在,Table3表中的数据也只有50万条.
      

  3.   

    C1:当我查询2月1号到3月10号的数据是,需要把Table2和Table3使用UNION ALL联合起来,速度还可以,加在一起大概200万条数据,1~2秒钟就出来了. C2:但是,当我只查询3月1号到3月10号的数据的时候,只用到了Table2,查询起来却慢的要死,大概要30~70秒钟的样子.
    3月1-10日数据量呢,而且表上的索引有重建吗
      

  4.   

    你不是说还有写的其他操作吗,我把Table3导出到另外的服务器上,只查询(没有程序对它做写入操作)再执行C2的时候,速度就很快了. 
    你查询时加上锁试试
      

  5.   


    C2那种查询是在Table3中查询的(刚才打字打错了),Table2中,存放2月份的数据,大概150万条,Table3中存放3月份的数据,(1号-9号)大概50万条.
    索引是使用标识ID建立的,因为这两个表都要求实时的数据插入(1天大概插入5万条),所以没有建立其它索引.
      

  6.   

    应该和数据更新有关,加上with(nolock)试验下
      

  7.   

    C1所查询的数据,包括Table2和Table3,而C2所查询的数据,只有Table3.TO:SQL77 至于加锁机制,我有两个问题:1,会不会导致实时数据无法写入?2,C1查询用到的数据,完全包含了C2,但是C1没有加锁,情况很好,效率比较好.TO:ldslove:至于索引,两个表的索引是一样,只建立了标识ID索引.TO:fredrickhu:也使用事件探测器了,不过,我的查询语句只执行了一次,更多的是UPDATE和INSERT语句(实时数据上传写入到数据库).感谢几位大牛能亲临指点....能不能再给点想法....
      

  8.   

    DBCC REINDEX 重新建立索引试试
      

  9.   

    * DBCC DBREINDEX 
    重建指定数据库的一个或多个索引 
    * DBCC INDEXDEFRAG 
    对表或视图上的索引和非聚集索引进行碎片整理 
      

  10.   

    TO:fredrickhu.索引重新整理了.没有效果.
    TO:zsforever.在Table3后面加上with(nolock)了,还是一样,没有效果.现在的疑惑椒,Table2和Table3联合起来查询,没有问题,挺快的.就是单独查询Table3的数据非常慢....
      

  11.   

    SELECT * FROM TABLE3 WITH(TABLOCK)你查一下执行计划是哪的问题,
      

  12.   

    就是使用的UNION ALL,直接在SQL语句查询的.
    3月份的只在Table3中,没有使用联合.
      

  13.   

    那在两个表的日期字段建立索引试下
    另外查询的时候要用
    where 日期字段 >= '2010-02-01'
    and 日期字段<'2010-03-10'
    不要用datediff,dateadd,datepart等函数
      

  14.   

    因为Table3,有数据实时写入(每天大概4-5万条).
    刚才我让写Table3的进程停止了,没有数据写入了.
    做上面的查询,还是比较慢,情况没有任何好转.
    但是,我把Table3的数据导入到另外的表中(tempTable),再做上面的查询.速度就很快,秒杀(不到1秒钟).怎么办,怎么办?难道是表出来问题了?
    但是,我把Table2与Table3UNION查询的时候,速度也很快,如果是表Table3出现了问题,那这个又做何解释?
      

  15.   

    C2:但是,当我只查询3月1号到3月10号的数据的时候,只用到了Table2,查询起来却慢的要死,大概要30~70秒钟的样子.
    查3月的 为什么要查table2?
      

  16.   


    请看前面三楼最开始打错了,但是CSDN不允许编辑....
      

  17.   


    --C1:第一种情况,选择2月份和3月分的数据
    --Table2数据在150万左右,Table3在40万左右,此情况执行耗费在1秒钟左右.
     SELECT b.MID ,--M编号
            b.PID ,--P编号
            COUNT(*) AS deltaCount ,--次数
            SUM(deltaTime) AS deltaTime--总时间
     FROM   ( 
              SELECT    
                        MID ,
                        PID ,
                        maxValue ,--最值
                        DATEDIFF(second, beginTime, endTime) AS deltaTime--时间差
              FROM      Table2
              WHERE     ( beginTime BETWEEN '2010-02-01 00:00:00'
                                    AND     '2010-03-09 00:00:00' )
              UNION ALL
              SELECT    MID ,
                        PID ,
                        maxValue ,
                        DATEDIFF(second, beginTime, endTime) AS deltaTime
              FROM      Table3
              WHERE     ( beginTime BETWEEN '2010-02-01 00:00:00'
                                    AND     '2010-03-09 00:00:00' )
            ) AS a
            RIGHT JOIN TableGASP AS b ON a.MID = b.MID
                                                            AND a.PID = b.PID
            LEFT JOIN TableGAS AS c ON b.gradealarmid = c.id
     WHERE  a.maxValue >= c.oneLevel --maxValue在[oneLevel,twoLevel),之间
            AND a.maxValue < c.twoLevel
     GROUP BY b.MID ,
            b.PID        
    ---------------------------------------------------------------C2:只选择3月份的数据.
    --此情况,耗费1分钟左右.
     SELECT b.MID ,
            b.PID ,
            COUNT(*) AS deltaCount ,
            SUM(deltaTime) AS deltaTime
     FROM   ( 
              SELECT    MID ,
                        PID ,
                        maxValue ,
                        DATEDIFF(second, beginTime, endTime) AS deltaTime
              FROM      Table3
              WHERE     ( beginTime BETWEEN '2010-03-01 00:00:00'
                                    AND     '2010-03-09 00:00:00' )
            ) AS a
            RIGHT JOIN TableGASP AS b ON a.MID = b.MID
                                                            AND a.PID = b.PID
            LEFT JOIN TableGAS AS c ON b.gradealarmid = c.id
     WHERE  a.maxValue >= c.oneLevel
            AND a.maxValue < c.twoLevel
     GROUP BY b.MID ,
            b.PID        
      

  18.   

       SELECT    MID ,
                        PID ,
                        maxValue ,
                        DATEDIFF(second, beginTime, endTime) AS deltaTime
              FROM      Table3
              WHERE     ( beginTime BETWEEN '2010-03-01 00:00:00'
                                    AND     '2010-03-09 00:00:00' )
    这段速度如何
      

  19.   


    没有得说.快.
    上面两个SQL语句,第一个执行很快,而且包含了第二个,如果第二个因为SQL语句执行有问题的,那第一个也解释不通.PS:如果两个表一起查询的时候,速度很快,但是如果单独查询Table3的时候,第二个SQL语句中的Group BY语句,会使得查询变的很慢.但是第一个SQL语句中同样也有Group By,而且一样包含Table3的数据.却没有这样的问题.