145 lines
6.7 KiB
SQL
145 lines
6.7 KiB
SQL
-- tworzy skrypt do tworzenia indeksów,
|
|
--bardzo przydatny do przenoszenia bazy wraz z obiektami albo do odgrywania brakujących indeksów
|
|
|
|
SELECT ' CREATE ' +
|
|
CASE
|
|
WHEN I.is_unique = 1 THEN ' UNIQUE '
|
|
ELSE ''
|
|
END +
|
|
I.type_desc COLLATE DATABASE_DEFAULT + ' INDEX ' +
|
|
I.name + ' ON ' +
|
|
SCHEMA_NAME(T.schema_id) + '.' + T.name + ' ( ' +
|
|
KeyColumns + ' ) ' +
|
|
ISNULL(' INCLUDE (' + IncludedColumns + ' ) ', '') +
|
|
ISNULL(' WHERE ' + I.filter_definition, '') + ' WITH ( ' +
|
|
CASE
|
|
WHEN I.is_padded = 1 THEN ' PAD_INDEX = ON '
|
|
ELSE ' PAD_INDEX = OFF '
|
|
END + ',' +
|
|
'FILLFACTOR = ' + CONVERT(
|
|
CHAR(5),
|
|
CASE
|
|
WHEN I.fill_factor = 0 THEN 100
|
|
ELSE I.fill_factor
|
|
END
|
|
) + ',' +
|
|
-- default value
|
|
'SORT_IN_TEMPDB = OFF ' + ',' +
|
|
CASE
|
|
WHEN I.ignore_dup_key = 1 THEN ' IGNORE_DUP_KEY = ON '
|
|
ELSE ' IGNORE_DUP_KEY = OFF '
|
|
END + ',' +
|
|
CASE
|
|
WHEN ST.no_recompute = 0 THEN ' STATISTICS_NORECOMPUTE = OFF '
|
|
ELSE ' STATISTICS_NORECOMPUTE = ON '
|
|
END + ',' +
|
|
' ONLINE = OFF ' + ',' +
|
|
CASE
|
|
WHEN I.allow_row_locks = 1 THEN ' ALLOW_ROW_LOCKS = ON '
|
|
ELSE ' ALLOW_ROW_LOCKS = OFF '
|
|
END + ',' +
|
|
CASE
|
|
WHEN I.allow_page_locks = 1 THEN ' ALLOW_PAGE_LOCKS = ON '
|
|
ELSE ' ALLOW_PAGE_LOCKS = OFF '
|
|
END + ' ) ON [' +
|
|
DS.name + ' ] ' + CHAR(13) + CHAR(10) + ' GO' [CreateIndexScript]
|
|
FROM sys.indexes I
|
|
JOIN sys.tables T
|
|
ON T.object_id = I.object_id
|
|
JOIN sys.sysindexes SI
|
|
ON I.object_id = SI.id
|
|
AND I.index_id = SI.indid
|
|
JOIN (
|
|
SELECT *
|
|
FROM (
|
|
SELECT IC2.object_id,
|
|
IC2.index_id,
|
|
STUFF(
|
|
(
|
|
SELECT ' , ' + C.name + CASE
|
|
WHEN MAX(CONVERT(INT, IC1.is_descending_key))
|
|
= 1 THEN
|
|
' DESC '
|
|
ELSE
|
|
' ASC '
|
|
END
|
|
FROM sys.index_columns IC1
|
|
JOIN sys.columns C
|
|
ON C.object_id = IC1.object_id
|
|
AND C.column_id = IC1.column_id
|
|
AND IC1.is_included_column =
|
|
0
|
|
WHERE IC1.object_id = IC2.object_id
|
|
AND IC1.index_id = IC2.index_id
|
|
GROUP BY
|
|
IC1.object_id,
|
|
C.name,
|
|
index_id
|
|
ORDER BY
|
|
MAX(IC1.key_ordinal)
|
|
FOR XML PATH('')
|
|
),
|
|
1,
|
|
2,
|
|
''
|
|
) KeyColumns
|
|
FROM sys.index_columns IC2
|
|
--WHERE IC2.Object_id = object_id('Person.Address') --Comment for all tables
|
|
GROUP BY
|
|
IC2.object_id,
|
|
IC2.index_id
|
|
) tmp3
|
|
)tmp4
|
|
ON I.object_id = tmp4.object_id
|
|
AND I.Index_id = tmp4.index_id
|
|
JOIN sys.stats ST
|
|
ON ST.object_id = I.object_id
|
|
AND ST.stats_id = I.index_id
|
|
JOIN sys.data_spaces DS
|
|
ON I.data_space_id = DS.data_space_id
|
|
JOIN sys.filegroups FG
|
|
ON I.data_space_id = FG.data_space_id
|
|
LEFT JOIN (
|
|
SELECT *
|
|
FROM (
|
|
SELECT IC2.object_id,
|
|
IC2.index_id,
|
|
STUFF(
|
|
(
|
|
SELECT ' , ' + C.name
|
|
FROM sys.index_columns IC1
|
|
JOIN sys.columns C
|
|
ON C.object_id = IC1.object_id
|
|
AND C.column_id = IC1.column_id
|
|
AND IC1.is_included_column =
|
|
1
|
|
WHERE IC1.object_id = IC2.object_id
|
|
AND IC1.index_id = IC2.index_id
|
|
GROUP BY
|
|
IC1.object_id,
|
|
C.name,
|
|
index_id
|
|
FOR XML PATH('')
|
|
),
|
|
1,
|
|
2,
|
|
''
|
|
) IncludedColumns
|
|
FROM sys.index_columns IC2
|
|
--WHERE IC2.Object_id = object_id('Person.Address') --Comment for all tables
|
|
GROUP BY
|
|
IC2.object_id,
|
|
IC2.index_id
|
|
) tmp1
|
|
WHERE IncludedColumns IS NOT NULL
|
|
) tmp2
|
|
ON tmp2.object_id = I.object_id
|
|
AND tmp2.index_id = I.index_id
|
|
WHERE I.is_primary_key = 0
|
|
AND I.is_unique_constraint = 0
|
|
--AND T.name NOT LIKE 'mt_%'
|
|
--AND I.name NOT LIKE 'mt_%'
|
|
--AND I.Object_id = object_id('Person.Address') --Comment for all tables
|
|
--AND I.name = 'IX_Address_PostalCode' --comment for all indexes
|
|
|