0

ストアドプロシージャのパラメータとしてテーブル値型があり、最大数千行が含まれています。このストアドプロシージャ(現在はMERGEとINSERT)に対していくつかの操作を実行しますが、それらの前に、述語でパラメーターの内容をフィルター処理します。

@data TableValuedType READONLY

MERGE INTO Table2
USING (
    SELECT ... FROM @data
    UNION
    SELECT ... FROM @data
    UNION
    ...)
ON ...
WHEN NOT MATCHED THEN ....

INSERT INTO Table3
    SELECT ... FROM @data

これを行う最も効率的な方法は、テーブルタイプの別の変数を宣言し、その変数に挿入してから、その変数を使用してマージして挿入する方法です。

DECLARE @sanitisedData TableValuedType
INSERT INTO @sanitisedData
    SELECT ... FROM @data
    WHERE <predicate>

または、@ dataから何かを選択するたびに述語を使用するには:

MERGE INTO Table2
USING (
    SELECT ... FROM @data WHERE <predicate>
    UNION
    SELECT ... FROM @data WHERE <predicate>
    UNION
    ...)
ON ...
WHEN NOT MATCHED THEN ....

INSERT INTO Table3
    SELECT ... FROM @data WHERE <predicate>

または、他の何か?

4

1 に答える 1

0

可能な限り @Table 変数を使用しないでください。ほとんどの場合、パフォーマンスが低下します。代わりに一時テーブルを選択してください。

とにかく、テーブル変数と一時テーブルの両方がディスクに書き込まれます。一時テーブルには、クエリ オプティマイザーが使用できる統計が含まれているため、テーブル変数よりも利点があります。一時テーブルにインデックス (クラスター化インデックスと非クラスター化インデックスの両方) を作成することもできますが、テーブル変数は作成できません。

したがって、一時テーブルを使用して、フィルター処理する列にインデックスを作成することをお勧めします。

お役に立てれば。

于 2012-03-28T22:10:00.497 に答える