現象
Microsoft SQL Server 2012 または Microsoft SQL Server 2014 のパラメーター化された結合フィルターと、結合レプリケーションで precomputed パーティションを使用することを前提とします。 フィルターのルート (Publisher 側) のテーブルで insert ステートメントを使用しようとすると、 挿入のパフォーマンスが低下することがあります。
解決方法
この修正プログラムを適用した後、パブリッシュされたデータベースで sp_vupgrade_mergeobjects プロシージャを手動で実行する必要があります。 この機能を使うと、アーティクル固有のトリガー、ストアドプロシージャ、ビューを再生成して、マージレプリケーションのデータの変更を追跡して適用することができます。この問題は、SQL Server の次の累積的な更新プログラムで最初に修正されました。
SQL Server 2014 の累積更新プログラム5 /en-us/help/3011055
SQL Server 2012 SP2 の累積更新プログラム3 /en-us/help/3002049
SQL Server 用の新しい累積更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正が含まれています。 SQL Server の最新の累積的な更新プログラムを確認します。
詳細情報
<の表に挿入>トリガーの Merge insert trigger MSmerge_ins_XXXXを実行すると、トリガーによってプロシージャMSmerge_expand_sp_XXXXが呼び出されます。この問題が発生した場合は、次のように、マージ展開プロシージャのInsert/Select Distinctステートメントを実行すると、時間がかかるMSmerge_expand_sp_XXXXます。 この状況では、INSERT のパフォーマンスが低下します。
insert into dbo.MSmerge_current_partition_mappings with (rowlock) (publication_number, tablenick, rowguid, partition_id) select distinct 1, mc.tablenick, mc.rowguid, v.partition_id from dbo.MSmerge_contents mc with (rowlock) JOIN dbo.[MSmerge_dynamic_filter_merge_new_settings_PARTITION_VIEW] v with (rowlock) ON mc.tablenick = <tablenick> and mc.rowguid = v.[rowguid] and mc.marker = @child_marker and v.partition_id in (select partition_id from dbo.MSmerge_current_partition_mappings cpm with (rowlock) JOIN dbo.MSmerge_contents mc2 with (rowlock) ON cpm.rowguid = mc2.rowguid and mc2.marker = @marker) where not exists (select * from MSmerge_current_partition_mappings with (readcommitted, rowlock, readpast) where publication_number = 1 and tablenick = <tablenick> and rowguid = v.[rowguid] and partition_id = v.partition_id)
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。