2011-09-12 20 views
1

私はデータをフェッチするためにストアドプロシージャを使用しています。私は動的にフィルタリングする必要がありました。例えば、idが5、10、または12のデータをフェッチしたい場合は、プロシージャに文字列として送信し、ユーザ定義関数を介してテーブルに変換します。しかし、私はので、ここでのパフォーマンスを考慮する例である必要があります。
ユーザー定義関数とパフォーマンスの使用

解決方法1:

SELECT * 
FROM Customers 
WHERE CustomerID NOT IN (SELECT Value 
         FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',',')); 

解決策2:パフォーマンスに優れているソリューション

CREATE TABLE #tempTable (Value NVARCHAR(4000)); 

INSERT INTO #tempTable 
     SELECT Value FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',',') 

SELECT * 
    FROM BusinessAds 
    WHERE AdID NOT IN (SELECT Value FROM #tempTable) 

DROP TABLE #tempTable 

答えて

2

あなたはおそらく、あなたはまた、TVFによって返されたテーブルの上にクラスタ化インデックスを置くことができる

CREATE TABLE #tempTable (Value int primary key); 
INSERT INTO #tempTable 
SELECT DISTINCT Value 
FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',',') 

クラスタ化インデックスと適切なデータ型を持つ#tempテーブルを作成したほうが良いでしょう。

#tempテーブルが作成された後に、TVFが再コンパイルするのではなく、TVFが1つの行を返すと常に仮定しているため、この仮定によって、次の場合に最適なクエリプランが生成されるかどうかを検討する必要があります。リストは大きいです。

関連する問題