Files
sql-scripts/idx1.sql
Schork Thierry (Galenica - ADM) 63d058a7eb added files from swmgmt03
2025-09-22 09:00:00 +02:00

146 lines
7.8 KiB
PL/PgSQL

/*
Server: samnb705db01.amavita.ch
Format: GCM
Business: TPPHAR
type: VALI
Version: 23.1.21006.00066
06.06.2024, TSC
*/
;WITH ColInfo
AS (SELECT TblName = o.name,
SchemaTbl = s.name + '.' + o.name,
IndexName = i.name,
IsPrimaryKey = [i].[is_primary_key],
IsUniqueConstraint = [i].[is_unique_constraint],
IsUnique = [i].[is_unique],
ColName = c.name,
IsComputedCol = [c].[is_computed],
IsIncludedCol = [ic].[is_included_column],
[ic].[key_ordinal],
FilterDefinition = [i].[filter_definition],
i.[index_id],
crlf = CHAR(13) + CHAR(10),
crlfgo = ';' + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10),
[o].[object_id]
FROM sys.objects o
INNER JOIN sys.schemas s
ON o.schema_id = s.schema_id
INNER JOIN sys.columns c
ON o.object_id = c.object_id
INNER JOIN sys.indexes i
ON c.object_id = i.object_id
INNER JOIN sys.index_columns ic
ON i.index_id = ic.index_id
AND o.object_id = ic.object_id
AND c.column_id = ic.column_id
WHERE s.name = 'dbo'
AND o.name = 'account_chart'
--AND i.filter_definition IS NOT NULL
)
SELECT DISTINCT [x].[TblName],
[x].[IndexName],
[x].[index_id],
[x].[IsPrimaryKey],
[x].[IsUniqueConstraint],
[x].[IsUnique],
--,size.IndexSizeKB
[c].[IndexColumns],
[ci].[IncludedColumns],
[cc].[ComputedColumns],
[x].[FilterDefinition],
[sz].[IndexSizeMB],
[us].[Reads],
[us].[Writes],
DropCreateSQL = [x].[crlf] + '-- ' + x.IndexName + [x].[crlf] +
--check drop
'IF INDEXPROPERTY(OBJECT_ID(''' + [x].[SchemaTbl] + '''), ''' + x.IndexName
+ ''' , ''IndexID'' ) IS NOT NULL BEGIN;' + [x].[crlf]
+ CASE
WHEN [x].[IsPrimaryKey] = 1 THEN NULL
WHEN [x].[IsUniqueConstraint] = 1 THEN
--drop statement
' ALTER TABLE ' + [x].[SchemaTbl] + ' DROP CONSTRAINT ' + x.IndexName + ';'
+ [x].[crlf] + 'END' + [x].[crlfgo]
--check create
+ 'IF INDEXPROPERTY(OBJECT_ID(''' + [x].[SchemaTbl] + '''), ''' + x.IndexName
+ ''' , ''IndexID'' ) IS NULL BEGIN;' + [x].[crlf] +
--create statement
+' ALTER TABLE '
+ [x].[SchemaTbl] + ' ADD CONSTRAINT ' + x.IndexName + ' UNIQUE ('
+ [c].[IndexColumns] + ');' + [x].[crlf] + 'END' + [x].[crlfgo]
ELSE
--drop statement
' DROP INDEX ' + [x].[SchemaTbl] + '.' + x.IndexName + ';' + [x].[crlf]
+ 'END' + [x].[crlfgo]
--check create
+ 'IF INDEXPROPERTY(OBJECT_ID(''' + [x].[SchemaTbl] + '''), ''' + x.IndexName
+ ''' , ''IndexID'' ) IS NULL BEGIN;' + [x].[crlf] +
--create statement
+' CREATE '
+ CASE
WHEN [x].[IsUnique] = 1 THEN 'UNIQUE '
ELSE '' END + 'INDEX ' + x.IndexName + ' ON ' + [x].[SchemaTbl] + '('
+ [c].[IndexColumns] + ')'
+ ISNULL(' INCLUDE(' + [ci].[IncludedColumns] + ')', '')
+ ISNULL(' WHERE ' + [x].[FilterDefinition], '') + ';' + [x].[crlf] + 'END'
+ [x].[crlfgo] END
FROM ColInfo x
OUTER APPLY ( SELECT IndexColumns = STUFF([sq].[strXML], 1, 2, '')
FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')
FROM ColInfo x2
WHERE x.TblName = [x2].[TblName]
AND x.IndexName = [x2].[IndexName]
AND [x2].[IsIncludedCol] = 0
ORDER BY x2.key_ordinal
FOR XML PATH('')) sq(strXML) ) c
OUTER APPLY ( SELECT IncludedColumns = STUFF([sq].[strXML], 1, 2, '')
FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')
FROM ColInfo x2
WHERE x.TblName = [x2].[TblName]
AND x.IndexName = [x2].[IndexName]
AND [x2].[IsIncludedCol] = 1
ORDER BY x2.key_ordinal
FOR XML PATH('')) sq(strXML) ) ci
OUTER APPLY ( SELECT ComputedColumns = STUFF([sq].[strXML], 1, 2, '')
FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')
FROM ColInfo x2
WHERE x.TblName = [x2].[TblName]
AND x.IndexName = [x2].[IndexName]
AND [x2].[IsComputedCol] = 1
ORDER BY x2.key_ordinal
FOR XML PATH('')) sq(strXML) ) cc
OUTER APPLY ( SELECT tblName = o.name,
o.type,
i.name AS [IndexName],
i.index_id,
[s].[user_seeks] + [s].[user_scans] + [s].[user_lookups] AS [Reads],
[s].[user_updates] AS [Writes],
i.type_desc AS [IndexType],
[i].[fill_factor] AS [FillFactor],
[i].[has_filter],
[i].[filter_definition],
[s].[last_user_scan],
[s].[last_user_lookup],
[s].[last_user_seek]
FROM sys.dm_db_index_usage_stats AS s WITH (NOLOCK)
INNER JOIN sys.indexes AS i WITH (NOLOCK)
ON s.object_id = i.object_id
INNER JOIN sys.objects o WITH (NOLOCK)
ON s.object_id = o.object_id
WHERE o.type = 'U' -- user table
AND i.index_id = s.index_id
AND [s].[database_id] = DB_ID()
AND o.name = x.TblName
AND i.name = x.IndexName) us
OUTER APPLY ( SELECT [i].[name] AS IndexName,
SUM([s].[used_page_count]) * 8 / 1024 AS IndexSizeMB
FROM sys.dm_db_partition_stats AS s
JOIN sys.indexes AS i
ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
WHERE s.[object_id] = x.[object_id] --OBJECT_ID('dbo.document_line')
AND [i].[name] = x.IndexName
GROUP BY [i].[name]) sz
ORDER BY [x].[index_id];