t-sql の通常のテーブルでの削除のパフォーマンス調整を見てきました。
しかし、テーブル変数の削除に関するパフォーマンスの微調整はありますか?
編集
例を次に示します。UserExclusionsEvaluate は実際には CTE であるため、プロットはより厚くなりますが、最初にテーブル変数を中心に最適化を試みます (可能であれば)。CTE 自体は非常に高速に実行されます。削除が遅いだけです。
DELETE FROM @UsersCriteria
FROM @UsersCriteria UsersCriteria
WHERE UserId IN (SELECT UserID FROM UserExclusionsEvaluate WHERE PushRuleExclusionMet = 1)
現在の化身では、 @UsersCriteria は次のとおりです。
DECLARE @UsersCriteria TABLE
(
UserId int primary key,
PushRuleUserCriteriaType int
)
@UsersCriteria を非プライマリとして試し、クラスター化された非クラスター化で実験しました。
また、IN に問題がある可能性もあります。サブクエリでJOINも試しました。
編集:
グッドニュース! suquery をチェーンされた CTE に移動したり、テーブル ヒントを試したりするなど、SQL でたくさん遊んだ後。
テーブル変数から一時テーブルに変更するだけで、パフォーマンスが劇的に向上しました。
これは非常に興味深いことです。削除は単独で正常に実行され、(CTE の) サブクエリは単独で正常に実行されました。しかし、2つを混合すると非常に遅くなりました。
サブクエリで CTE を使用すると、オプティマイザが起動できないのではないでしょうか? たぶん、削除と混合したとき。