Detlev Eberhardt 24.09.20
Über das nachfolgende Skript wird im MSSQL Server die Tabelle sys.dm_db_missing_index_groups mig abgefragt und fertige Indexe als Vorschlag vorbereitet.
Trotzdem unbedingt prüfen ob der Index sinnvoll ist. Ein Indikator dafür sind u.a. die Anzahl der user_seeks Falls und ob dieser fehlende Index eine tatsächlich Auswirkung hätte.
Falls ja, den Wert aus der Spalte create_index_statement rauskopieren und zur Anwendung bringen. Beispiel:
CREATE INDEX [idx_PROJEKTAKTE_FIRMENORDNER_KULIENR] ON [dwdata].[dbo].[PROJEKTAKTE_FIRMENORDNER] ([KULIENR]) INCLUDE ([DWDOCID], [DWDISK], [DWNAME], [DWSYSTEMFLAGS], [DWFORMAT], [DWSECTIONCOUNT], [DWTOTALPAGES], [DWEXTENSION], [DWDOCSIZE], [DWSTOREUSER], [DWSTOREDATETIME], [DWMODUSER], [DWMODDATETIME], [DWLASTACCESSUSER], [DWLASTACCESSDATETIME], [DWLOCKUSERID], [DWCHECKOUTINFO], [DWDOCGUID], [DWSTORAGESETTINGS], [DWVERSIONSTATE], [DWMAJORVERSION], [DWMINORVERSION], [DWVERSIONCOMMENT], [DWDOCUMENTTAG], [DWFIELDSTAG], [DWSECTIONSTAG], [DWCONTENTTAG], [DWANNOTATIONSTAG], [KU__LIEF_NAME], [BELEGART], [BELEGNUMMER], [BETREFF_KURZBESCHREIBUNG], [VERSANDART], [BARCODE], [TECHN_STATUS], [BELEGDATUM], [KOMMISSION], [POSTDATUM], [BETRAG], [VERANTWORTLICHER], [KFM__STATUS1], [KFM__STATUS2], [KFM__STATUS3], [KFM__STATUS4], [BELEGTYP], [DWMASTERDOCID], [BELEGNUMMER_NUM], [VORGANG_NUM], [EMAIL_ABSENDER], [EMAI_EMPFAENGER], [EMAIL_CC], [EMAIL_ANLAGEN], [ABGELEGT_VON_TF], [QRCODE], [AUFTRAGSNUMMERLANG], [BELEGSNUMMERLANG], [KONTROLLE])
Bei mehren Indexvorschlägen des Systems ist ggf. der Indexname anzupassen, weil Indexe mit gleichen Namen nicht angewandt werden können
SKRIPT:
SELECT
migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
'CREATE INDEX [idx_' -- + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle)
+ LEFT (PARSENAME(mid.statement, 1), 32) + '_'
+
Left(
Replace(
Replace(
Replace( ISNULL (mid.equality_columns,'')
+ CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN '_' ELSE '' END
+ ISNULL (mid.inequality_columns, ''),
'], [', '-' ),
']',''),
'[',''),
128)
+ ']'
+ ' ON ' + mid.statement
+ ' (' + ISNULL (mid.equality_columns,'')
+ CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END
+ ISNULL (mid.inequality_columns, '')
+ ')'
+ ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
and last_user_seek >= '2014-10-02'
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC