create as a system procedure, or in specific database
use: same as sp_helpindex
modify as desired
create as a system procedure, or in specific database
use: same as sp_helpindex
modify as desired
-- www.qdpma.com/SQL/SqlScripts.html
-- updates 2018-03-06
-- 2018-04-08 sys.stats is_incremental
USE master -- skip this for Azure
GO
IF EXISTS (
SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID('sp_helpindex2')
) DROP procedure [dbo].sp_helpindex2
GO
CREATE PROCEDURE [dbo].[sp_helpindex2]
@objname nvarchar(776)
AS
DECLARE @objid int , @dbname sysname
-- Check to see that the object names are local to the current database.
select @dbname = parsename(@objname ,3)
if @dbname is null
select @dbname = db_name()
else if @dbname <> db_name()
begin
raiserror(15250, -1,-1)
return (1)
end
-- Check to see the the table exists and initialize @objid.
select @objid = object_id(@objname)
if @objid is NULL
begin
raiserror(15009, -1,-1, @objname,@dbname)
return (1)
end
;WITH b AS (
SELECT d.object_id, d.index_id, part = COUNT(*) , pop = SUM(CASE row_count WHEN 0 THEN 0 ELSE 1 END)
, reserved = 8*SUM(d.reserved_page_count)
, used = 8*SUM(d.used_page_count)
, in_row_data = 8*SUM(d.in_row_data_page_count)
, lob_used = 8*SUM(d.lob_used_page_count)
, overflow = 8*SUM(d.row_overflow_used_page_count)
, row_count = SUM(row_count)
, notcompressed = SUM(CASE data_compression WHEN 0 THEN 1 ELSE 0 END)
, compressed = SUM(CASE data_compression WHEN 0 THEN 0 ELSE 1 END) -- change to 0 for SQL Server 2005
FROM sys.dm_db_partition_stats d WITH(NOLOCK)
INNER JOIN sys.partitions r WITH(NOLOCK) ON r.partition_id = d.partition_id
GROUP BY d.object_id, d.index_id
), j AS (
SELECT j.object_id, j.index_id, j.key_ordinal, c.column_id, c.name, j.is_descending_key, j.is_included_column
, j.partition_ordinal
FROM sys.index_columns j
INNER JOIN sys.columns c ON c.object_id = j.object_id AND c.column_id = j.column_id
)
SELECT ISNULL(i.name, '')[index]
, ISNULL(STUFF(( SELECT ', ' + name + CASE is_descending_key WHEN 1 THEN '-' ELSE '' END
+ CASE partition_ordinal WHEN 1 THEN '*' ELSE '' END
FROM j WHERE j.object_id = i.object_id AND j.index_id= i.index_id AND j.key_ordinal > 0
ORDER BY j.key_ordinal FOR XML PATH(''), TYPE, ROOT).value('root[1]', 'nvarchar(max)'),1,1, '') ,'') as Keys
, ISNULL(STUFF(( SELECT ', ' + name + CASE partition_ordinal WHEN 1 THEN '*' ELSE '' END
FROM j WHERE j.object_id = i.object_id AND j.index_id = i.index_id
AND (j.is_included_column= 1 OR (j.key_ordinal= 0 AND partition_ordinal = 1) )
ORDER BY j.column_id FOR XML PATH(''), TYPE, ROOT).value('root[1]', 'nvarchar(max)'),1,1, '') ,'') as Incl
--, j.name AS ptky
, i.index_id
, CASE WHEN i.is_primary_key = 1 THEN 'PK'
WHEN i.is_unique_constraint= 1 THEN 'UC'
WHEN i.is_unique = 1 THEN 'U'
WHEN i.type = 0 THEN 'heap'
WHEN i.type = 3 THEN 'X'
WHEN i.type = 4 THEN 'S'
ELSE CONVERT(char, i.type) END typ
, i.data_space_id dsi
, b.row_count
, b.in_row_data in_row , b.overflow ovf , b.lob_used lob
, b.reserved - b.in_row_data - b.overflow- b.lob_used unu
, 'ABR' = CASE row_count WHEN 0 THEN 0 ELSE 1024*used/row_count END
, y.user_seeks, y.user_scans u_scan, y.user_lookups u_look, y.user_updates u_upd
, b.notcompressed ncm , b.compressed cmp , b.pop, b.part
, rw_delta = b.row_count - s.rows, s.rows_sampled --, s.unfiltered_rows
, s.modification_counter mod_ctr, s.steps
, CONVERT(varchar, s.last_updated,120) updated
, i.is_disabled dis, i.is_hypothetical hyp, ISNULL(i.filter_definition, '') filt
, t.no_recompute no_rcp , t.is_incremental incr
FROM sys.objects o
JOIN sys.indexes i ON i.object_id = o.object_id
LEFT JOIN sys.stats t ON t.object_id = o.object_id AND t.stats_id = i.index_id
LEFT JOIN b ON b.object_id = i.object_id AND b.index_id = i.index_id
LEFT JOIN sys.dm_db_index_usage_stats y ON y.object_id = i.object_id AND y.index_id = i.index_id
AND y.database_id = DB_ID()
OUTER APPLY sys.dm_db_stats_properties(i.object_id, i.index_id) s
--LEFT JOIN j ON j.object_id = i.object_id AND j.index_id = i.index_id AND j.partition_ordinal = 1
WHERE i.object_id = @objid
GO
-- Then mark the procedure as a system procedure.
EXEC sys.sp_MS_marksystemobject 'sp_helpindex2' -- skip this for Azure
GO
SELECT NAME, IS_MS_SHIPPED FROM SYS.OBJECTS WHERE NAME LIKE 'sp_helpindex%'
GO
--DROP PROCEDURE dbo.sp_helpindex2