Files
sql-snippets/idx1-fb34ee85-4240-4e00-bc54-1388acccb026.json
2025-07-07 09:09:23 +02:00

6 lines
8.2 KiB
JSON

{
"id": "fb34ee85-4240-4e00-bc54-1388acccb026",
"prefix": "idx1",
"description": "list all indexes on a given table",
"body": ";WITH ColInfo\r\n AS (SELECT TblName = o.name,\r\n SchemaTbl = s.name + '.' + o.name,\r\n IndexName = i.name,\r\n IsPrimaryKey = [i].[is_primary_key],\r\n IsUniqueConstraint = [i].[is_unique_constraint],\r\n IsUnique = [i].[is_unique],\r\n ColName = c.name,\r\n IsComputedCol = [c].[is_computed],\r\n IsIncludedCol = [ic].[is_included_column],\r\n [ic].[key_ordinal],\r\n FilterDefinition = [i].[filter_definition],\r\n i.[index_id],\r\n crlf = CHAR(13) + CHAR(10),\r\n crlfgo = ';' + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10),\r\n [o].[object_id]\r\n FROM sys.objects o\r\n INNER JOIN sys.schemas s\r\n ON o.schema_id = s.schema_id\r\n INNER JOIN sys.columns c\r\n ON o.object_id = c.object_id\r\n INNER JOIN sys.indexes i\r\n ON c.object_id = i.object_id\r\n INNER JOIN sys.index_columns ic\r\n ON i.index_id = ic.index_id\r\n AND o.object_id = ic.object_id\r\n AND c.column_id = ic.column_id\r\n WHERE s.name = 'dbo'\r\n AND o.name = '$CURSOR$'\r\n--AND i.filter_definition IS NOT NULL\r\n)\r\nSELECT DISTINCT [x].[TblName],\r\n [x].[IndexName],\r\n [x].[index_id],\r\n [x].[IsPrimaryKey],\r\n [x].[IsUniqueConstraint],\r\n [x].[IsUnique],\r\n --,size.IndexSizeKB\r\n [c].[IndexColumns],\r\n [ci].[IncludedColumns],\r\n [cc].[ComputedColumns],\r\n [x].[FilterDefinition],\r\n [sz].[IndexSizeMB],\r\n [us].[Reads],\r\n [us].[Writes],\r\n DropCreateSQL = [x].[crlf] + '-- ' + x.IndexName + [x].[crlf] +\r\n --check drop\r\n 'IF INDEXPROPERTY(OBJECT_ID(''' + [x].[SchemaTbl] + '''), ''' + x.IndexName\r\n + ''' , ''IndexID'' ) IS NOT NULL BEGIN;' + [x].[crlf]\r\n + CASE\r\n WHEN [x].[IsPrimaryKey] = 1 THEN NULL\r\n WHEN [x].[IsUniqueConstraint] = 1 THEN\r\n --drop statement\r\n ' ALTER TABLE ' + [x].[SchemaTbl] + ' DROP CONSTRAINT ' + x.IndexName + ';'\r\n + [x].[crlf] + 'END' + [x].[crlfgo]\r\n --check create\r\n + 'IF INDEXPROPERTY(OBJECT_ID(''' + [x].[SchemaTbl] + '''), ''' + x.IndexName\r\n + ''' , ''IndexID'' ) IS NULL BEGIN;' + [x].[crlf] +\r\n --create statement\r\n +' ALTER TABLE '\r\n + [x].[SchemaTbl] + ' ADD CONSTRAINT ' + x.IndexName + ' UNIQUE ('\r\n + [c].[IndexColumns] + ');' + [x].[crlf] + 'END' + [x].[crlfgo]\r\n ELSE\r\n --drop statement\r\n ' DROP INDEX ' + [x].[SchemaTbl] + '.' + x.IndexName + ';' + [x].[crlf]\r\n + 'END' + [x].[crlfgo]\r\n --check create\r\n + 'IF INDEXPROPERTY(OBJECT_ID(''' + [x].[SchemaTbl] + '''), ''' + x.IndexName\r\n + ''' , ''IndexID'' ) IS NULL BEGIN;' + [x].[crlf] +\r\n --create statement\r\n +' CREATE '\r\n + CASE\r\n WHEN [x].[IsUnique] = 1 THEN 'UNIQUE '\r\n ELSE '' END + 'INDEX ' + x.IndexName + ' ON ' + [x].[SchemaTbl] + '('\r\n + [c].[IndexColumns] + ')'\r\n + ISNULL(' INCLUDE(' + [ci].[IncludedColumns] + ')', '')\r\n + ISNULL(' WHERE ' + [x].[FilterDefinition], '') + ';' + [x].[crlf] + 'END'\r\n + [x].[crlfgo] END\r\n FROM ColInfo x\r\n OUTER APPLY ( SELECT IndexColumns = STUFF([sq].[strXML], 1, 2, '')\r\n FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')\r\n FROM ColInfo x2\r\n WHERE x.TblName = [x2].[TblName]\r\n AND x.IndexName = [x2].[IndexName]\r\n AND [x2].[IsIncludedCol] = 0\r\n ORDER BY x2.key_ordinal\r\n FOR XML PATH('')) sq(strXML) ) c\r\n OUTER APPLY ( SELECT IncludedColumns = STUFF([sq].[strXML], 1, 2, '')\r\n FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')\r\n FROM ColInfo x2\r\n WHERE x.TblName = [x2].[TblName]\r\n AND x.IndexName = [x2].[IndexName]\r\n AND [x2].[IsIncludedCol] = 1\r\n ORDER BY x2.key_ordinal\r\n FOR XML PATH('')) sq(strXML) ) ci\r\n OUTER APPLY ( SELECT ComputedColumns = STUFF([sq].[strXML], 1, 2, '')\r\n FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')\r\n FROM ColInfo x2\r\n WHERE x.TblName = [x2].[TblName]\r\n AND x.IndexName = [x2].[IndexName]\r\n AND [x2].[IsComputedCol] = 1\r\n ORDER BY x2.key_ordinal\r\n FOR XML PATH('')) sq(strXML) ) cc\r\n OUTER APPLY ( SELECT tblName = o.name,\r\n o.type,\r\n i.name AS [IndexName],\r\n i.index_id,\r\n [s].[user_seeks] + [s].[user_scans] + [s].[user_lookups] AS [Reads],\r\n [s].[user_updates] AS [Writes],\r\n i.type_desc AS [IndexType],\r\n [i].[fill_factor] AS [FillFactor],\r\n [i].[has_filter],\r\n [i].[filter_definition],\r\n [s].[last_user_scan],\r\n [s].[last_user_lookup],\r\n [s].[last_user_seek]\r\n FROM sys.dm_db_index_usage_stats AS s WITH (NOLOCK)\r\n INNER JOIN sys.indexes AS i WITH (NOLOCK)\r\n ON s.object_id = i.object_id\r\n INNER JOIN sys.objects o WITH (NOLOCK)\r\n ON s.object_id = o.object_id\r\n WHERE o.type = 'U' -- user table\r\n AND i.index_id = s.index_id\r\n AND [s].[database_id] = DB_ID()\r\n AND o.name = x.TblName\r\n AND i.name = x.IndexName) us\r\n OUTER APPLY ( SELECT [i].[name] AS IndexName,\r\n SUM([s].[used_page_count]) * 8 / 1024 AS IndexSizeMB\r\n FROM sys.dm_db_partition_stats AS s\r\n JOIN sys.indexes AS i\r\n ON s.[object_id] = i.[object_id]\r\n AND s.index_id = i.index_id\r\n WHERE s.[object_id] = x.[object_id] --OBJECT_ID('dbo.document_line')\r\n AND [i].[name] = x.IndexName\r\n GROUP BY [i].[name]) sz\r\nORDER BY [x].[index_id];\r\n"
}