可以使用Common Table表达式来提高性能吗?

时间:2011-07-01 11:47:27

标签: sql-server-2005 tsql sql-server-2008

可以使用COMMON表表达式来避免SQL Server每个记录执行以下字符串解析两次吗?我的猜测是“不。”

SELECT DISTINCT
    Client_ID
    ,RIGHT('0000000' + RIGHT(Client_ID
                             ,PATINDEX('%[^0-9]%'
                                       ,REVERSE('?' + Client_ID)) - 1)
           ,7) AS CorrectedClient
FROM
    membob_vw
WHERE
    Client_ID <> RIGHT('0000000' + RIGHT(Client_ID
                                         ,PATINDEX('%[^0-9]%'
                                                   ,REVERSE('?' + Client_ID)) - 1)
                       ,7)
ORDER  BY
    1
    ,2 

每当我尝试将SQL格式化为“代码块”时,它看起来很好(在多行上显示),直到刷新页面,之后显示SQL,至少对我来说,所有在一行上 - 而我似乎无法确定这一点。

对于那些使用IE6新浏览器的人来说,它是否显示了这种方式?我的公司强加给我这个POS浏览器,阻止我使用任何其他浏览器。

2 个答案:

答案 0 :(得分:3)

不,CTE不会对此查询执行任何性能方面的操作。两次输入相同的大字符串表达式可能看起来很奇怪/效率低下。但是,SQL Server每行只会执行一次字符串表达式,它已经针对这样的事情进行了优化。

修改
CTE将减少重复代码:

;WITH AllRows AS (
SELECT DISTINCT
    Client_ID
    ,RIGHT('0000000' + RIGHT(Client_ID
                             ,PATINDEX('%[^0-9]%'
                                       ,REVERSE('?' + Client_ID)) - 1)
           ,7) AS CorrectedClient
FROM
    membob_vw
)
SELECT * FROM AllRows WHERE Client_ID<>CorrectedClient
ORDER  BY
    1
    ,2 

但不会表现得更好。使用SET SHOWPLAN_ALL ON,我敢打赌,您会看到每个版本的查询计划相同。

小心谨慎,让查询看起来漂亮并减少冗余代码片段!简单的SQL更改可能会对性能产生重大不利影响!始终执行(运行和/或查询计划)检查您所做的任何更改。我已经看到对立即运行的查询进行了微不足道的更改,这导致它们需要花费几分钟才能运行。 SQL的关键是性能不是很好的代码。如果应用程序很慢,谁会关心代码是否正常。

答案 1 :(得分:1)

如果您要经常运行此查询,特别是如果Client_ID很少更新,您应该考虑计算列或预先计算CorrectedClient并单独存储。