;WITH IndexColumns AS ( SELECT DISTINCT a.object_id, a.name, a.type_desc, b.column_id, TABLE_NAME=c.name, [COL NAME]=d.name FROM sys.indexes a INNER JOIN sys.index_columns b ON a.object_id = b.object_id AND a.index_id = b.index_id INNER JOIN sys.tables c ON b.object_id = c.object_id INNER JOIN sys.columns d ON c.object_id = d.object_id AND b.column_id = d.column_id WHERE is_hypothetical = 0 ), CombineCols AS ( SELECT object_id, name, type_desc, table_name ,columns=STUFF(( SELECT ',' + [COL NAME] FROM IndexColumns b WHERE a.object_id = b.object_id AND a.name = b.name AND a.type_desc = b.type_desc AND a.TABLE_NAME = b.TABLE_NAME ORDER BY [COL NAME] FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '') FROM IndexColumns a GROUP BY object_id, name, type_desc, table_name)SELECT b.type_desc, a.table_name, a.columns, b.nameFROM ( SELECT table_name, columns FROM CombineCols GROUP BY table_name, columns HAVING COUNT(name) > 1) aINNER JOIN CombineCols b ON a.table_name = b.table_name AND a.columns = b.columns ORDER BY a.table_name, a.columns
CREATE TABLE dupIndexes (id1 INT, id2 INT, id3 INT, id4 INT)CREATE INDEX idx_dupIndexes_01 ON dupIndexes (id1, id2)CREATE INDEX idx_dupIndexes_02 ON dupIndexes (id2, id1)CREATE INDEX idx_dupIndexes_03 ON dupIndexes (id2, id1) INCLUDE (id3)CREATE INDEX idx_dupIndexes_04 ON dupIndexes (id2, id1) INCLUDE (id3, id4)CREATE INDEX idx_dupIndexes_05 ON dupIndexes (id2, id1) INCLUDE (id4, id3)CREATE INDEX idx_dupIndexes_06 ON dupIndexes (id2, id1, id3)
CREATE TABLE dupIndexes2 (id1 INT, id2 INT, id3 INT, id4 INT)CREATE INDEX idx_dupIndexes2_01 ON dupIndexes2 (id1, id2)CREATE INDEX idx_dupIndexes2_02 ON dupIndexes2 (id1, id2, id3)
WITH IndexColumns AS ( SELECT DISTINCT a.object_id, a.name, a.type_desc, b.column_id, TABLE_NAME=c.name, [COL NAME]=d.name, b.is_included_column FROM sys.indexes a INNER JOIN sys.index_columns b ON a.object_id = b.object_id AND a.index_id = b.index_id INNER JOIN sys.tables c ON b.object_id = c.object_id INNER JOIN sys.columns d ON c.object_id = d.object_id AND b.column_id = d.column_id WHERE is_hypothetical = 0 ), CombineCols AS ( SELECT object_id, name, type_desc, table_name ,columns=STUFF(( SELECT ',' + [COL NAME] FROM IndexColumns b WHERE a.object_id = b.object_id AND a.name = b.name AND a.type_desc = b.type_desc AND a.TABLE_NAME = b.TABLE_NAME AND b.is_included_column = 0 ORDER BY [COL NAME] FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '') ,include_columns=ISNULL(STUFF(( SELECT ',' + [COL NAME] FROM IndexColumns b WHERE a.object_id = b.object_id AND a.name = b.name AND a.type_desc = b.type_desc AND a.TABLE_NAME = b.TABLE_NAME AND b.is_included_column = 1 ORDER BY [COL NAME] FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, ''), '') FROM IndexColumns a GROUP BY object_id, name, type_desc, table_name)SELECT b.type_desc, a.table_name, a.columns, a.include_columns, b.nameFROM ( SELECT table_name, columns, include_columns FROM CombineCols GROUP BY table_name, columns, include_columns HAVING COUNT(name) > 1) aINNER JOIN CombineCols b ON a.table_name = b.table_name AND a.columns = b.columns AND a.include_columns = b.include_columnsORDER BY a.table_name, a.columns