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语句,此时无任何不良状况,由此我怀疑是SQL对CTE语句进行性能分析优化处理不当,导致死循环的产生。看来CTE还不是太成熟,以后的使用可能要稍微注意一下。

