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

パフォーマンスに優れたソリューションはどれですか?

4

1 に答える 1

2

#tempおそらく、クラスター化インデックスと適切なデータ型を使用してテーブルを作成する方がよいでしょう

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',',')

TVF によって返されるテーブルにクラスター化インデックスを配置することもできます。

どちらが優れているかについては、SQL Server は、テーブルにデータが入力された後に再コンパイルするのではなく、TVF が 1 行を返すと常に想定する#tempため、リストが大きい場合に、この想定が最適でないクエリ プランを引き起こす可能性があるかどうかを検討する必要があります。

于 2011-09-12T13:20:33.713 に答える