2011-07-01 14 views
3

可以使用COMMON表達式來避免SQL Server每條記錄執行兩次以下字符串解析?我的猜測是「不」。這裏可以使用Common Table表達式來獲得性能嗎?

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瀏覽器,並阻止我使用任何其他。

回答

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,我敢打賭你會看到每個版本的查詢計劃。

BE CAREFUL試圖使查詢看起來很漂亮並減少冗餘代碼段!簡單的SQL更改可能會對性能產生重大影響!總是表現(運行和/或查詢計劃)檢查您所做的任何更改。我看到了對即時運行的查詢所做的微小更改,結果導致他們花費了幾分鐘時間運行。與SQL的關鍵是性能不漂亮的代碼。如果應用程序很慢,誰會關心代碼看起來不錯。

+0

這就是我的想法。我希望有一種方法是通過定義某種「行子例程」 – ChadD

1

如果你要運行這個查詢很多,特別是如果Client_ID很少更新,你應該考慮一個計算列或預先計算CorrectedClient並單獨存儲它。

+0

+1來最小化冗餘代碼,這個查詢的真正問題是數據的存儲方式。每當你對數據進行瘋狂的字符串操作以獲得所需的值時,這對於糟糕的設計來說是一個紅旗。如果一列包含若干個「分開」,當分開時有各自的含義,您應該將它們存儲爲單獨的列。例如,如果您有一列「PersonName」並將其存儲爲「倒數第一」,則在您需要按姓氏搜索和/或排序數據之前,一切都會好起來的。在這一點上,你可以使用一個荒謬的字符串拆分例程或創建3列:FirstName,MiddleName,LastName。 –

相關問題