可以使用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浏览器,阻止我使用任何其他浏览器。
答案 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并单独存储。