Indizes aktualisieren….

/**************************************************************
 Bitte als SYSDBA anmelden.

 DEFRAGMENTATION von Indizes - es ist nicht notwendig zusätzliche
 Bibliotheken aufzurufen

 ACHTUNG: HIER SIND ZWEI STELLEN FREIZUSCHALTEN!!!

 HINWEIS: die richtige DB festlegen
   
***************************************************************/
use   --FranksDB
go
--Hier ist bewusst ein Fehler eingebaut, damit die DB korrekt festgelegt ist


--DEFRAGMENTATION:
SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname sysname;
DECLARE @objectname sysname;
DECLARE @indexname sysname;
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command varchar(8000);
-- ensure the temporary table does not exist
IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
	DROP TABLE work_to_do;

--diesen parameter "DB_ID()" darf man nicht benutzten - wieso auch immmer
DECLARE @DBID bigint;
select @DBID=DB_ID();

-- conditionally select from the function, converting object and index IDs to names.
SELECT	object_id AS objectid,
	index_id AS indexid,
	partition_number AS partitionnum,
	avg_fragmentation_in_percent AS frag
INTO work_to_do
FROM sys.dm_db_index_physical_stats (@DBID, NULL, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;
-- Declare the cursor for the list of partitions to be processed.
DECLARE partitions CURSOR FOR SELECT * FROM work_to_do;

-- Open the cursor.
OPEN partitions;

-- Loop through the partitions.
FETCH NEXT
	FROM partitions
	INTO @objectid, @indexid, @partitionnum, @frag;

WHILE @@FETCH_STATUS = 0
	BEGIN;
	SELECT @objectname = o.name, @schemaname = s.name
	FROM sys.objects AS o
	JOIN sys.schemas as s ON s.schema_id = o.schema_id
	WHERE o.object_id = @objectid;

	SELECT @indexname = name FROM sys.indexes WHERE object_id = @objectid AND index_id = @indexid;

	SELECT @partitioncount = count (*) FROM sys.partitions  WHERE object_id = @objectid AND index_id = @indexid;

	-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding
	IF @frag <= 10.0
	BEGIN;
		SELECT @command = 'Index: [' + @indexname + '] ON [' + @schemaname + '].[' + @objectname + ']...OK';
	END;

	IF @frag > 10.0 AND @frag <= 30.0
	BEGIN;
		SELECT @command = 'ALTER INDEX [' + @indexname + '] ON [' + @schemaname + '].[' + @objectname + '] REORGANIZE';
		IF @partitioncount > 1
			SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR, @partitionnum);
		--EXEC (@command);  -----HIER FREISCHALTEN!!!!!
	END;

	IF @frag > 30.0
	BEGIN;
		SELECT @command = 'ALTER INDEX [' + @indexname +'] ON [' + @schemaname + '].[' + @objectname + '] REBUILD';
		IF @partitioncount > 1
			SELECT @command = @command + ' PARTITION=' + CONVERT (CHAR, @partitionnum);
		--EXEC (@command); -----HIER FREISCHALTEN!!!!!
	END;
	PRINT 'Executed ' + @command;

	FETCH NEXT FROM partitions INTO @objectid, @indexid, @partitionnum, @frag;
END;
-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;

-- drop the temporary table
--Select * from work_to_do
IF EXISTS (SELECT name FROM sys.objects WHERE name = 'work_to_do')
	DROP TABLE work_to_do;

-- FERTIG Meldung
PRINT 'All Indices was reorganized or rebuilded. '

T-SQL: Fehlende Indizes…

Häufig scheinen Abfragen überraschend langsam sein, oder immer langsam werden…. Als Tunings-Maßnahme lohnen sich meist als erster Versuch Indizes in der Datenbank. Lediglich sind bestimmte Rechte für der u. g. TSQL-Code notwendig


-- Missing Index Script
-- Original Author: Pinal Dave (C) 2011
-- verändert von Frank Odenbreit 2011/2013/2016

/*
Es werden zwar die 50 wichtigsten Indizes geholt und diese nachher sortiert nach ihrem Namen
(Ähnlichkeiten sollte man erkennen können, ggf. anpassen bzw. aus kommentieren)
*/


Select *
from (
SELECT TOP 50
	dm_mid.database_id AS DatabaseID,
	dm_migs.user_seeks as user_seeks,
	dm_migs.avg_user_impact as avg_user_impact, 
	dm_migs.avg_user_impact * (dm_migs.user_seeks+dm_migs.user_scans) AS Avg_Estimated_Impact,
	dm_migs.last_user_seek AS Last_User_Seek,	object_name(dm_mid.object_id) AS [TableName],
	--*,

	'CREATE NONCLUSTERED INDEX [ndx' + object_name(dm_mid.object_id) + '__'
	+ REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.equality_columns,''),', ','_'),'[',''),']','') +
	CASE
	WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns IS NOT NULL THEN '_'
	ELSE ''
	END
	+ REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.inequality_columns,''),', ','_'),'[',''),']','')
	+ ']'
	
	+ ' ON ' + dm_mid.statement		+ ' (' + ISNULL (dm_mid.equality_columns,'')
	+ CASE WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns IS NOT NULL THEN ',' ELSE
	'' END
	+ ISNULL (dm_mid.inequality_columns, '')
	+ ')'
	
	+ ISNULL (' INCLUDE (' + dm_mid.included_columns + ')', '') 
	+ '  WITH (pad_index=OFF,Fillfactor=90,ignore_dup_key=OFF,allow_row_locks=ON,allow_page_locks=ON,DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]'
	
	AS Create_Statement
	
FROM sys.dm_db_missing_index_groups dm_mig
	INNER JOIN sys.dm_db_missing_index_group_stats dm_migs ON dm_migs.group_handle = dm_mig.index_group_handle
	INNER JOIN sys.dm_db_missing_index_details dm_mid ON dm_mig.index_handle = dm_mid.index_handle
WHERE dm_mid.database_ID = DB_ID()
ORDER BY Avg_Estimated_Impact DESC 
) as t
order by Create_Statement asc