「パブリッシャ」アプリケーションは、非常に複雑なビューを問い合せ、結果を非正規化ビュー・モデル表にマージすることによって、ビュー・モデルを最新の状態に保つことができます、更新、および削除操作を実行します。T-SQL MERGE典型的なパブリッシング・コンテキストでのパフォーマンス
SQL 2008にアップグレードしたので、これをSQL MERGEステートメントで更新するのが最適なタイミングだと思いました。ただし、クエリの作成後、MERGEステートメントのサブツリーコストは1214.54です!古い方法では、挿入/更新/削除の合計はわずか0.104でした!
私は、同じ正確な操作をより簡単に説明する方法が、どんなにクレイジーであるかを理解できません。おそらく、私ができない場所での私の方法のエラーを見ることができます。
テーブル上の統計:190万行あり、MERGE操作ごとに100個を超える挿入、更新、または削除を行います。私のテストケースでは、1つだけが影響を受けます。
-- This table variable has the EXACT same structure as the published table
-- Yes, I've tried a temp table instead of a table variable, and it makes no difference
declare @tSource table
(
Key1 uniqueidentifier NOT NULL,
Key2 int NOT NULL,
Data1 datetime NOT NULL,
Data2 datetime,
Data3 varchar(255) NOT NULL,
PRIMARY KEY
(
Key1,
Key2
)
)
-- Fill the temp table with the desired current state of the view model, for
-- only those rows affected by @Key1. I'm not really concerned about the
-- performance of this. The result of this; it's already good. This results
-- in very few rows in the table var, in fact, only 1 in my test case
insert into @tSource
select *
from vw_Source_View with (nolock)
where Key1 = @Key1
-- Now it's time to merge @tSource into TargetTable
;MERGE TargetTable as T
USING tSource S
on S.Key1 = T.Key1 and S.Key2 = T.Key2
-- Only update if the Data columns do not match
WHEN MATCHED AND T.Data1 <> S.Data1 OR T.Data2 <> S.Data2 OR T.Data3 <> S.Data3 THEN
UPDATE SET
T.Data1 = S.Data1,
T.Data2 = S.Data2,
T.Data3 = S.Data3
-- Insert when missing in the target
WHEN NOT MATCHED BY TARGET THEN
INSERT (Key1, Key2, Data1, Data2, Data3)
VALUES (Key1, Key2, Data1, Data2, Data3)
-- Delete when missing in the source, being careful not to delete the REST
-- of the table by applying the T.Key1 = @id condition
WHEN NOT MATCHED BY SOURCE AND T.Key1 = @id THEN
DELETE
;
これはどのようにして1200のサブツリーコストになりますか?テーブル自体からのデータアクセスは非常に効率的であるようです。インデックスを更新(12%)< - - 分類(87%)<
MERGE(0%)<:実際には、MERGEのコストの87%は、チェーンの終わり近くにソート操作からのようです - (...)
この並べ替えには、0行の入力と出力があります。 0行をソートするのに87%のリソースが必要なのはなぜですか?
UPDATE
私は要旨にexecution plan for just the MERGE operation(推定ではない)、実際に投稿しました。
動作するかどうかを知ることができますが、実際の実行計画を投稿することができますか?私はこれが推定された計画ではなく実際のものであると仮定しています。 – JNK
MERGEの実行計画を要点に追加しました。明らかに、私は雇用者の幸福を改善するためにすべてのデータベース名を変更しました。プランXMLにも同様の変更を加えようとしました。私は何かをねじにしなかったことを願っています!これは、SQL Management Studioにはまだ読み込まれます。 –
リソースの87%を占めるわけではありません。実際の計画に示されているコストは、依然として見積もりコストです。実際に何が起こったのかを考慮して調整しません。なんらかの理由で、それは3、348,560行をソートすることになると考えています。 '[Action1007] IS NOT NULL'のフィルタは、実際の行数を0に減らし、その後はすべての原価計算をオフにします。 –