2012-10-22 22 views
10

Tôi có một máy chủ SQL được thiết lập với sao chép hợp nhất thành 800 máy khách di động chạy SQL CE.Chèn trong cơ sở dữ liệu Nhân rộng Hợp nhất cực kỳ chậm

Máy chủ có đủ tài nguyên và các dòng trong và ngoài công ty là quá đủ, bản sao giữa máy khách và máy chủ nói chung là tốt nhưng chúng tôi gặp phải lỗi liên tục mà tôi không thể theo dõi.

Hôm qua, chúng tôi cần chèn 550 bản ghi vào một trong các bảng chính của chúng tôi, trình kích hoạt duy nhất tồn tại là các sao chép hợp nhất chuẩn.

Chèn này mất 14 giờ do liên tục bị bế tắc với các thiết bị di động đang cố gắng đồng bộ hóa.

Có ai có bất kỳ lời khuyên nào về cách chúng ta có thể tránh các khóa bị chèn và cách tăng tốc toàn bộ quy trình không?

------ Cập nhật -----

Sau ngày từ một số ý kiến ​​tôi đã chạy một hồ sơ trên một chèn duy nhất và tôi nhìn thấy rất nhiều loại điều này

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) 

Đối với nhiều bảng mà tôi không muốn chèn vào ... đây có phải là đầu mối không?

+0

1. Mức cách ly được sử dụng bằng cách chèn và đồng bộ hóa là gì? Thường chèn không phải là một vấn đề. 2. Bạn có bao nhiêu chỉ mục? 3. Bạn có các chỉ mục không gia tăng và sẽ khiến các bản ghi được chèn vào giữa cấu trúc cây thay vì kết thúc? 4. Bạn có chỉ số nhóm? – Farfarak

+0

1. Không chắc chắn về mức độ cô lập .. nó chỉ là một tuyên bố chèn tiêu chuẩn - 2. Chúng tôi đang chèn vào bảng A trong đó có 1 chỉ số tiêu chuẩn .. Tuy nhiên kích hoạt nhân rộng hợp nhất dính nó vào nhiều bảng khác - 3. Không phải trên bảng chúng tôi đang chèn vào - 4. No –

+0

1. Bạn có truy vấn đang được gọi trong quá trình sao chép có thể là quá trình sao chép chặn toàn bộ bảng trong trường hợp của bạn (bạn không có chỉ số nhóm) 2. Có khóa duy nhất trên bàn ? – Farfarak

Trả lời

0

Trong các chỉ mục cuối chỉ được trợ giúp cho đến nay, có vẻ như sao chép hợp nhất không được thiết lập rất tốt trên hệ thống này.

Tuy nhiên, sử dụng Chèn hàng loạt mà không kích hoạt trình kích hoạt và sau đó sử dụng sp_addtabletocontents giải quyết được sự cố của chúng tôi.

Như một mặt lưu ý chúng tôi phải làm một bản cập nhật cơ bản

Cập nhật Bảng thiết COLUMN1 = COLUMN1

sau khi chúng tôi đã chèn số lượng lớn để sao chép merge thông báo các bảng liên kết khác mà nó đã thay đổi khác không tất cả dữ liệu được truyền chính xác.

8

gần đây chúng tôi đã trải nghiệm cùng một hành vi trong hệ thống của chúng tôi khá giống với máy của bạn. Lý do là một lượng lớn dữ liệu trong msmerge_contents và msmsmerge_current_partition_mappings, và chúng tôi nhận thấy rằng nó có thể là một chỉ mục bị thiếu bằng cách xem xét số hàng được đọc trong SQL Profiler. (49 000 000 lần đọc cho một chèn đơn giản trong một cho các bảng có vẻ một chút nhiều)

Giải Quyết 30 phút trước bằng cách thêm hai chỉ số:

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]) 

Tôi hy vọng điều này có thể giúp bạn, nó giúp chúng tôi thấp hơn thời gian truy vấn từ 5 phút đến 10 giây.

- Một vài giờ sau đó ...

Đồng nghiệp của tôi tìm thấy một chỉ số tiếp tục tăng hiệu quả hoạt động bằng cách thêm 75%:

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

Xác định thiếu chỉ số Bạn có thể sử dụng tập lệnh sau để xác định các chỉ mục bị thiếu, được sắp xếp với chỉ mục được mong đợi để tăng hiệu suất nhiều nhất ở trên cùng (Có rất nhiều tập lệnh như vậy đang lưu hành, mã này được mượn từ 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 
Các vấn đề liên quan