none
关于sql server一个非常非常奇怪的问题! RRS feed

  • 问题

  • 一个非常奇怪的问题,不是亲自遇到,真不敢相信。不知道是不是sql的bug?

    今天一个运行很久的数据库服务,突然出问题了,cpu很高,进过一个下午的排查,发现问题出现在一个很复杂的存储过程里面,然后经过分析得到以下的结果,匪夷所思的结果!

                
    SELECT HasRoom FROM  Htl_Hotels(NOLOCK) A                 
    LEFT JOIN  (SELECT  HotelCode AS htlCode,1 HasRoom FROM  Htl_Room (NOLOCK) BB
    			INNER JOIN 
    			  ( SELECT RoomCode  FROM Htl_RoomInfo (NOLOCK)  
    				WHERE RoomDate > CONVERT(VARCHAR(10), GETDATE(), 112)  AND VarRoomCount>0 
    				GROUP BY RoomCode
    			  ) AS AA ON BB.RoomCode = AA.RoomCode
    			  GROUP BY HotelCode
    		    )AS HR  ON A.HotelCode=HR.htlCode
    WHERE 1=1  AND A.RegionCode = '3261' AND A.HtlState = 4

    这条语句,执行时一直等待,大概隔了两分钟过后,提示“用户已经取消查询!”

    然后我略微改了下:

    SELECT * FROM  Htl_Hotels(NOLOCK) A                 
    LEFT JOIN  (SELECT  HotelCode AS htlCode,1 HasRoom FROM  Htl_Room (NOLOCK) BB
    			INNER JOIN 
    			  ( SELECT RoomCode  FROM Htl_RoomInfo (NOLOCK)  
    				WHERE RoomDate > CONVERT(VARCHAR(10), GETDATE(), 112)  AND VarRoomCount>0 
    				GROUP BY RoomCode
    			  ) AS AA ON BB.RoomCode = AA.RoomCode
    			  GROUP BY HotelCode
    		    )AS HR  ON A.HotelCode=HR.htlCode
    WHERE 1=1  AND A.RegionCode = '3261' AND A.HtlState = 4

    执行很快,1秒钟都不要就执行完成了!

    然后我在次更改了下!

    将第一条语句的where后面加条件:
    HotelID BETWEEN 1 AND 50000     --执行顺畅
    HotelID BETWEEN 50000 AND 70000     --执行顺畅
    HotelID BETWEEN 1 AND 70000     --执行一直等待

    多多少少我做了很多次测试;

    BETWEEN 的区间跨度很大的时候就会一直等待,但是又没有具体值,有时候1到60032的时候能执行成功,再次执行可能就失败了!

    另外我要说明的是,50000到70000这个区间内是没有记录的

    将数据库拉倒本地测试机器上,一点问题有没有,而且这个也是运行了1年之久的服务器,没经过任何改动,突然出现的问题!

    不知道哪位大神,遇到过同样的问题,求解,万分感谢!



    2013年10月18日 6:09

答案

  • 像前面各位大侠所说的,更新一下统计信息

    最好把执行计划发上来看一下

    建表语句

    建索引语句都发上来

    查询语句和执行计划对应发上来

    数据量有多少

    这样大家好判断

    2013年10月18日 7:57

全部回复