Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 这里可以使用公共表表达式来提高性能吗?_Sql Server 2005_Tsql_Sql Server 2008 - Fatal编程技术网

Sql server 2005 这里可以使用公共表表达式来提高性能吗?

Sql server 2005 这里可以使用公共表表达式来提高性能吗?,sql-server-2005,tsql,sql-server-2008,Sql Server 2005,Tsql,Sql Server 2008,可以使用公共表表达式来避免SQL Server对每条记录执行两次以下字符串解析吗?我猜不是 SELECT DISTINCT Client_ID ,RIGHT('0000000' + RIGHT(Client_ID ,PATINDEX('%[^0-9]%' ,REVERSE('?' + Client_ID)) - 1) ,7)

可以使用公共表表达式来避免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浏览器强加给我,并禁止我使用任何其他浏览器。

不,CTE不会对此查询执行任何性能方面的操作。在同一个东西中键入两次大字符串表达式似乎很奇怪/效率低下。然而,SQLServer每行只执行一次字符串表达式,它已经针对类似的事情进行了优化

编辑 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的关键是性能,而不是漂亮的代码。如果应用程序很慢,谁会在乎代码是否好看。

如果你要运行这个查询很多,特别是如果客户机很少更新的话,你应该考虑一个计算列或者预先计算好的客户机并单独存储它。我希望有一个was来最小化冗余代码,比如定义一个行子程序+1,这个查询的真正问题是数据的存储方式。每当您对数据进行疯狂的字符串操作以获得所需的值时,这就是坏设计的危险信号。如果一列包含多个拆分后具有单独含义的部分,则应将它们存储为单独的列。例如,如果您有一个PersonName列,并将其存储为first-middle-last,则在您需要按姓氏搜索和/或排序数据之前,一切都将正常。此时,您可以使用一个可笑的字符串拆分例程或创建3列:FirstName、MiddleName、LastName。