SQL Server 2005的CTE不成熟?

上周工作中发现这个问题,当时在做SQL语句的优化,结果让我碰上了——
SQL语句大概如下(SQL参数略):

WITH CTE_TQ-- CTE,
         (        … …          )
         
AS
         (
         
SELECT … …,
                   
SUM(xxx) 
                   
FROM …
                   
JOIN … ON …
                   
JOIN … ON …
                   
WHERE    … …
                   
GROUP BY … …
         )
         
SELECT c1.xxx AS 'xx',
                   c1.xxx 
AS 'xx',
                   c1.xxx 
AS 'xx',
                   cte1.xxx 
AS 'xx1',
                   c1.xxx 
AS 'xx',
                   cte2.xxx 
AS 'xx2',
                   c1.xxx 
AS 'xx',
                   
SUM(c1.xxx) AS 'xx3'
         
FROM CTE_TQ c1
         
JOIN
         (
                   
SELECT … …,
                          
SUM(xxx) AS 'xx'
                   
FROM CTE_TQ
                   
GROUP BY … …
         ) cte1
         
ON … …
         
JOIN
         (
                   
SELECT … …,
                          
SUM(xxx) AS 'xx'
                   
FROM CTE_TQ
                   
GROUP BY … …
         ) cte2
         
ON … …
         
GROUP BY … …
         
ORDER BY c1.xxx

    在SQL查询分析器中执行是没问题的,主表数据12000+,执行时间2秒。但在WEBForm那里传SQL过来,就变成了以下语句(SQL参数略):

EXEC   SP_EXCUTESQL  N’xxxxxxxxxx’

    “xxxxxxxxxx”即上一页的SQL语句。数据量较大的时候(查询条件中有时间范围可以设置)经常超时(30秒),开始以为是ASP.NET的问题,后来将改语句放到SQL查询分析器中执行,结果一样。
    我测试了几次,发现如果是较少数据的情况下该语句大部份时间能正常执行,然后数据递增的情况下也比较正常,应该是执行计划的缘故。数据量剧增的话则会出现SQL一直在执行而没有结果现实的情况(执行时间已超过5分钟),我判断此时SQL应该已经陷入死循环了。
    最后我去掉
CTE,仅执行原CTE中的那一部分内容,即比较简单的SELECT语句,此时无任何不良状况,由此我怀疑是SQLCTE语句进行性能分析优化处理不当,导致死循环的产生。看来CTE还不是太成熟,以后的使用可能要稍微注意一下。

posted @ 2008-01-01 21:48 Carrod 阅读(454) 评论(5) 编辑 收藏