TSQL Scripts to Analyze Merge Replication Filter Logic

Provided by: Suresh B. Kandoth, SR Escalation Engineer, Microsoft SQL Escalation Services

These 2 scripts are used by the SQL Server Replication Support team to help analyze the Filter Logic used in Merge Replication.  The first lists all defined Subset and Join filters.  The first listing shows published table with indexes, the second listing shows published tables without any indexes.  If you’re seeing performance problems with Merge Replication, I begin investigating why the second list of tables has no indexes.

This example is based on the Northwind samples database provided with SQL Server 2000.  The published tables are Customers –> Orders –> OrderDetails.  The Subset filter is based on Country = Host_Name() with Join filters to pickup the matching Orders and OrderDetails rows.

Script 1: TSQL Scripts to Analyze Merge Replication Filter Logic - Part 1

Published Tables WITH Indexes  (paste in Notepad w/o wordwrapping)

>>Query to return articles (for each publication) for which there is a filter defined
Publication Name                    join_filterid filtername                          Article Name                        Object Id   Object Name                         nickname    Join Article Name                   Join Object Id Join Object Name                    join_nickname join_filterclause                   filter_type join_unique_key
----------------------------------- ------------- ----------------------------------- ----------------------------------- ----------- ----------------------------------- ----------- ----------------------------------- -------------- ----------------------------------- ------------- ----------------------------------- ----------- ---------------
NWINDMERGE                          1             Orders_Customers                    Orders                              181575685   Orders                              727001      Customers                           69575286       Customers                           727000        [Customers].[CustomerID] = [Orders  1           1
NWINDMERGE                          2             Order Details_Orders                Order Details                       117575457   Order Details                       10727000    Orders                              181575685      Orders                              727001        [Orders].[OrderID] = [Order Detail  1           0

(2 row(s) affected)

Published Tables WITHOUT Indexes  (paste in Notepad w/o wordwrapping)

>>Query to return filter definitions on tables which have no index defined
Publication Name                    join_filterid filtername                          Article Name                        Object Id   Object Name                         nickname    Join Article Name                   Join Object Id Join Object Name                    join_nickname join_filterclause                   filter_type join_unique_key
----------------------------------- ------------- ----------------------------------- ----------------------------------- ----------- ----------------------------------- ----------- ----------------------------------- -------------- ----------------------------------- ------------- ----------------------------------- ----------- ---------------

Script 2:TSQL Scripts to Analyze Merge Replication Filter Logic - Part 2

The second script analyzes the filters to ensure appropriate indexes are created to support these Filters.  In the output below we can see there is a missing index in the join relationship between Customer and Orders.

Warning!!! Carefully review the indexes of the table [Customers] and filters specified for the article [Orders]

Published Tables Index Analysis  (paste in Notepad w/o wordwrapping)

>>Script to explictly check for columns used in the article filter and check existence of indexes on those columns
Filter : Orders_Customers    Join clause specified: [Customers].[CustomerID] = [Orders].[CustomerID]
        Indexes for Object : Orders
              <idx>
                        <IndexName>PK_Orders</IndexName><index_id>1</index_id><type_desc>CLUSTERED</type_desc>
                              <col><ColumnName>OrderID</ColumnName><column_id>1</column_id><is_merge_published>1</is_merge_published>
                                    <indcol><key_ordinal>1</key_ordinal><is_included_column>0</is_included_column><is_descending_key>0</is_descending_key>
                                    </indcol>
                              </col>
                  </idx>
                 The following index recommendations were provided by the Missing Index Information DMVs:
                     CREATE INDEX IDX_Missing_Index_Orders_hdl_4_1 ON [Northwind2000].[dbo].[Orders] ([CustomerID] , [rowguid]) INCLUDE ([OrderID], [EmployeeID], [OrderDate], [RequiredDate], [ShippedDate], [ShipVia], [Freight], [ShipName], [ShipAddress], [ShipCity], [ShipRegion], [ShipPostalCode], [ShipCountry])
        Indexes for Object : Customers
Msg 50000, Level 11, State 2, Line 102
                Warning!!! Carefully review the indexes of the table [Customers] and filters specified for the article [Orders]
Filter : Order Details_Orders    Join clause specified: [Orders].[OrderID] = [Order Details].[OrderID]
        Indexes for Object : Order Details
              <idx>
                        <IndexName>PK_Order Details</IndexName><index_id>1</index_id><type_desc>CLUSTERED</type_desc>
                              <col><ColumnName>OrderID</ColumnName><column_id>1</column_id><is_merge_published>1</is_merge_published>
                                    <indcol><key_ordinal>1</key_ordinal><is_included_column>0</is_included_column><is_descending_key>0</is_descending_key>
                                    </indcol>
                              </col>
                              <col><ColumnName>ProductID</ColumnName><column_id>2</column_id><is_merge_published>1</is_merge_published>
                                    <indcol><key_ordinal>2</key_ordinal><is_included_column>0</is_included_column><is_descending_key>0</is_descending_key>
                                    </indcol>
                              </col>
                  </idx>
        Indexes for Object : Orders
              <idx>
                        <IndexName>PK_Orders</IndexName><index_id>1</index_id><type_desc>CLUSTERED</type_desc>
                              <col><ColumnName>OrderID</ColumnName><column_id>1</column_id><is_merge_published>1</is_merge_published>
                                    <indcol><key_ordinal>1</key_ordinal><is_included_column>0</is_included_column><is_descending_key>0</is_descending_key>
                                    </indcol>
                              </col>
                  </idx>
                 The following index recommendations were provided by the Missing Index Information DMVs:
                     CREATE INDEX IDX_Missing_Index_Order Details_hdl_4_2 ON [Northwind2000].[dbo].[Orders] ([CustomerID] , [rowguid]) INCLUDE ([OrderID], [EmployeeID], [OrderDate], [RequiredDate], [ShippedDate], [ShipVia], [Freight], [ShipName], [ShipAddress], [ShipCity], [ShipRegion], [ShipPostalCode], [ShipCountry])