2011-07-01 7 views
3

COMMONテーブル式を使用すると、SQL Serverがレコードごとに次の文字列解析を2回実行することを回避できますか?私の推測は「いいえ」です。ここでは、パフォーマンスのために共通テーブル式を使用できますか?

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をフォーマットしようとするたび私はそれをcorerctすることはできません。

IE6の新しいブラウザを使用している人向けにこの方法が表示されますか?私の会社はこのPOSブラウザを私に強制し、他のものを使用するのを妨げます。

答えて

3

いいえ、CTEはこのクエリでパフォーマンスを向上させることはありません。同じことを大きな文字列式に2回入力すると、奇妙で​​非効率的に思えるかもしれません。ただし、SQL Serverは文字列式を行ごとに1回しか実行しません。そのようなものに最適化されています。

EDIT
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 

をしかし、任意のパフォーマンスが向上しません。 USE SET SHOWPLAN_ALL ONを使用すると、各バージョンの同じクエリプランが表示されます。

クエリをきれいに見せて、冗長なコードフラグメントを減らしてください。単純なSQLの変更は、パフォーマンスに大きな影響を与える可能性があります。常にパフォーマンス(実行計画および/またはクエリ計画)を確認してください。私は瞬時に実行されるクエリに軽微な変更が加えられたことを見て、その結果、実行に数分かかることになりました。 SQLの鍵は、コードではないパフォーマンスです。アプリケーションが遅い場合、コードがよく見える場合は誰が気にします。

+0

これは私が考えたものです。私は "行のサブルーチン" – ChadD

1

このクエリを頻繁に実行する場合、特にClient_IDがあまり更新されない場合は、計算列を考慮するか、CorrectedClientを事前計算して別々に格納する必要があります。

+0

+1の並べ替えを定義することによって冗長コードを最小限に抑えることがあったと期待していた、このクエリの実際の問題は、データが格納される方法です。必要な値を得るためにデータに狂った文字列操作を行うたびに、それは悪いデザインの赤い旗です。列に複数の「パーツ」が含まれていて、分割されたときに個々の意味がある場合は、それらを個別の列として格納する必要があります。たとえば、 "PersonName"という列があり、 "first middle last"として格納している場合は、姓でデータを検索および/またはソートする必要があるまですべてが正常です。その時点で、ばかげた文字列分割ルーチンを使うか、FirstName、MiddleName、LastNameの3つの列を作成することができます。 –

関連する問題