2017-02-28 12 views
0

私はストアドプロシージャに郡の文字列を渡すSSRSレポートを持っています。報告書を作成しなければならなかったので、私は36桁のGUIDを郡に追加する必要がありました。私は、substring関数を使用してストアドプロシージャでGUIDを取り除く:サブストリング機能に代わるより高速な方法はありますか?

and county IN(Select substring(item, 1, LEN(item)-36) from fnsplit(@County, ',') 

報告書は、REPLACE関数を超える広大な改善である、約8秒で実行されます。しかし、私はまだこれをもっと速く走らせたいと思っています。誰もがこれを行うためのより良い方法を知っていますか?テーブルにインデックスを含めることは許可されていないため、オプションではありません。

+0

ここhttp://stackoverflow.com/questions/3828374/relative-performance-in-sqlserver-of-substring-vs-a-right-left-comboを見てみましょう。 –

+0

サブストリングが本当に問題である場合は、かなり奇妙に聞こえます。あなたの問題を引き起こすfnsplitではないと確信していますか?実際には、文全体、クエリ計画を含める必要があります。これは関数なので、プランキャッシュからのパフォーマンス統計も確認することをお勧めします。 –

+0

fnsplitは3つの異なる変数で実行されますが、非常に高速です。それは、それが減速した部分文字列()を追加したときだけでした。関数の実行計画を見ると、2つの表挿入に50%のコストしか表示されません。変数から統計を見る良い方法はありますか?実行計画を実行すると、変数の代わりに1つのレコードしか挿入できませんでした。 – jackstraw22

答えて

0

テーブル変数に最初にロードして内部結合すると、おそらく速度が最大になります。

DECLARE @COUNTYLIST TABLE ([County] varchar(36) PRIMARY KEY); 
INSERT INTO @COUNTYLIST ([County]) 
    Select substring(item, 1, LEN(item)-36) from fnsplit(@County, ',') 

SELECT ... 
FROM ... INNER JOIN @COUNTYLIST as [CountyList] 
    ON ...[County] = [CountyList].[County] 
+1

これはおそらく1行を含むと推定されるため、レポートがあまり頻繁に実行されず、再コンパイルが問題になると仮定すると、 'option(recompile)'で何が起こるかを試してみることもできます。 –

+0

残念ながら、@countyパラメータをSSRSに戻す必要があり、このようにテーブル変数が機能しないため、これは機能しません。たぶんテーブル変数の代わりに別の一時テーブルを作成しても問題ありません。私は朝にこれを試さなければならないでしょう。 – jackstraw22

+0

もう一度悪いです。それは動作します。 – jackstraw22

関連する問題