sp_index_visual – A tabular visualization of a table’s columns and if they are indexed

During some SQL development, I ran into an instance where I wanted to evaluate the existing indexes on a table to see if any of them nearly covered my query.  Additionally, given a large number of existing indexes on the table, I figured I might be removing/consolidating some. I’m very visual, so opening each index individually didn’t seem to help me track which columns were used in which index. Enter sp_index_visual.


The whole project is now stored on GitHub , but I’m going to run through the meat and potatoes.

 

After adding the stored procedure to a database, you can run it with the table name as the sole parameter to obtain a breakdown of the indexes on the table.

  • C = clustered index
  • X = unclustered index
  • i = included column

 

[sql]

-- sp_index_visual
-- 2/13/2017
-- drewsk.tech

CREATE PROCEDURE dbo.sp_index_visual
	@INQTABLE NVARCHAR(100)
AS
BEGIN
	SET NOCOUNT ON;

    DECLARE @COLUMNS NVARCHAR(MAX)
	DECLARE @QSQL NVARCHAR(MAX)

	SET @COLUMNS = STUFF((SELECT  ', [' +  NAME + ']   ' FROM
		( select ind.name
			from sys.tables t 
			left JOIN sys.indexes ind ON ind.object_id = t.object_id 
			WHERE t.name = @INQTABLE) TUF
			FOR XML PATH(''), TYPE
			).value('.', 'NVARCHAR(MAX)')
		,1,1,'')

	set @QSQL = 'select *
	from
	(
	select 
	ind.name as indexname, 
	tcol.name as ['+@INQTABLE+' Columns],
	case when ic.is_included_column = 0 then 
			case when ind.type = 1 then ''C'' else ''X'' end
		else ''i'' end as columnused
	from sys.tables t 
	INNER JOIN sys.columns tcol on t.object_id = tcol.object_id
	left JOIN sys.index_columns ic ON t.object_id = ic.object_id and ic.column_id = tcol.column_id --and ic.is_included_column = 0
	left JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id 
	left JOIN sys.indexes ind ON ind.object_id = t.object_id  and ind.index_id = ic.index_id
	WHERE t.name = N'''+@INQTABLE+'''
	) indecies
	PIVOT
	(
	max(columnused)
	for indexname IN ('+@COLUMNS+')
	) as pivottable;'


	EXECUTE(@QSQL)
END
GO

[sql]

 

 

There are lots of options to improve the procedure further in the future:

  • drop if exists
  • order indexes by clustered, # of columns, etc
  • display uniqueness constraints
  • display foreign keys