2012-10-22 41 views
10

SQL CEを実行している800のモバイルクライアントに対してマージレプリケーションをセットアップするSQLサーバーがあります。マージレプリケーションデータベースの挿入が非常に遅い

サーバーには十分なリソースがあり、社内外の回線が十分であるため、クライアントとサーバー間のレプリケーションは一般的には良好ですが、私は追跡できない断続的なエラーが発生しています。

昨日私たちのメインテーブルの1つに550レコードを挿入する必要がありました。存在する唯一のトリガーは標準のマージレプリケーションです。

このインサートは、同期しようとしているモバイルデバイスで継続的にデッドロックが発生するため、14時間かかりました。

私たちが挿入時のロックを回避する方法と、プロセス全体をスピードアップする方法に関するアドバイスはありますか?

------更新-----

私は、単一のインサート上でプロファイラを実行してきたいくつかのコメントに続いて、私はこの種のものをたくさん見ている

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_JEMProjectME_PromotionResource_PARTITION_VIEW] v with (rowlock) 
      ON mc.tablenick = 286358001 
      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 = 286358001 and 
       rowguid = v.[rowguid] and 
       partition_id = v.partition_id) 

私が挿入してはいけない多くのテーブルでは、これは手がかりになる可能性がありますか?

+0

1.挿入レベルと同期レベルで使用される分離レベルは何ですか?通常、挿入は問題ではありません。 2.いくつの索引を持っていますか? 3.インクリメンタルではないインデックスがあり、最後のレコードではなくツリー構造の中間にレコードが挿入されますか? 4.クラスタ化インデックスはありますか? – Farfarak

+0

1.分離レベルではわかりません。標準的な挿入ステートメントです。2. 1つの標準インデックスを持つテーブルAに挿入します。ただし、マージレプリケーショントリガーは他の多くのテーブルにスティックします。いいえ –

+0

1.レプリケーション中に呼び出されているクエリは、レプリケーションプロセスがケースヒープ内の全テーブルをブロックしている可能性があります(クラスタ化インデックスはありません)。テーブル? – Farfarak

答えて

0

これまでの索引では、マージレプリケーションがこのシステムではうまくセットアップされていないように見えました。

ただし、トリガーを起動せずに一括挿入を使用してから、sp_addtabletocontentsを使用して問題を解決しました。そのマージレプリケーションは、それが他にない変わっていた他のリンクテーブルを通知してサイドノートとして

は、我々は一括挿入をした後

更新表は列1 =列1

を設定する基本的な更新をしなければなりませんでしたすべてのデータが正しく伝搬されました。

8

私たちは最近、私たちのシステムであなたと非常にsimularである同じ動作を経験しました。その理由は、msmerge_contentsとmsmsmerge_current_partition_mappingsに大量のデータが含まれていたため、SQLプロファイラで読み取られた行数を調べると、インデックスが見つからない可能性があることがわかりました。 、私は、これはあなたを助けることを願って

CREATE NONCLUSTERED INDEX [IX_MSmerge_current_partition_mappings_PERF1] ON [dbo].[MSmerge_current_partition_mappings] 
(
    [partition_id] ASC 
) 
INCLUDE ([rowguid]) 


CREATE NONCLUSTERED INDEX [IX_msmerge_contents_PERF1] ON [dbo].[MSmerge_contents] 
(
    [marker] ASC 
) 
INCLUDE ([rowguid]) 

を、それは下私たちを助けた:

は、2つのインデックスを追加することにより、30分前に解決(49 000 000は、テーブルに1つの中の単純な挿入のために読み込む少しくらい見えました)クエリ時間は5分から10秒です。 -

は、数時間後に...

私の同僚は、さらに別の75%で、パフォーマンスを高め、別のインデックスが見つかりました:

CREATE NONCLUSTERED INDEX [IX_MSmerge_current_partition_mappings_PERF2] ON [dbo].[MSmerge_current_partition_mappings] 
(
    [rowguid] ASC, 
    [partition_id] ASC 
) 

を使用できインデックス が不足して特定します(このようなスクリプトが多数循環しており、http://www.sherbaz.com/category/sqlserver/から借用されています)

SELECT sys.objects.name 
, (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) AS Impact 
, 'CREATE NONCLUSTERED INDEX ix_IndexName ON ' + sys.objects.name COLLATE DATABASE_DEFAULT + ' (' + IsNull(mid.equality_columns, '') + CASE WHEN mid.inequality_columns IS NULL 
       THEN '' 
    ELSE CASE WHEN mid.equality_columns IS NULL 
        THEN '' 
     ELSE ',' END + mid.inequality_columns END + ') ' + CASE WHEN mid.included_columns IS NULL 
       THEN '' 
    ELSE 'INCLUDE (' + mid.included_columns + ')' END + ';' AS CreateIndexStatement 
, mid.equality_columns 
, mid.inequality_columns 
, mid.included_columns 
    FROM sys.dm_db_missing_index_group_stats AS migs 
      INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs.group_handle = mig.index_group_handle 
      INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle AND mid.database_id = DB_ID() 
      INNER JOIN sys.objects WITH (nolock) ON mid.OBJECT_ID = sys.objects.OBJECT_ID 
    WHERE  (migs.group_handle IN 
     ( 
     SELECT  TOP (500) group_handle 
      FROM   sys.dm_db_missing_index_group_stats WITH (nolock) 
      ORDER BY (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) DESC)) 
     AND OBJECTPROPERTY(sys.objects.OBJECT_ID, 'isusertable')=1 
    ORDER BY 2 DESC , 3 DESC