Alle Statistiken und Indexe einer SQL-Server-Datenbank aktualisieren

Mit dem Befehl sp_updatestats ist das möglich:

Ich führe so etwas gerne auch in einem regelmäßigen Konsolenprogramm als geplante Aufgabe aus.

Alternativ gibt es auch den „Wartungsplanungs-Assistent“, der so etwas dann regelmäßig ausführen kann:

Aufrufen im SQL Server Management Studio über den Baum „Verwaltung > Wartungspläne“ und dort auf den Knoten dann Rechtsklick.

Um das für alle Datenbanken eines Datenbankservers auszuführen, eignet sich folgendes Skript:

DECLARE @SQL VARCHAR(1000) 
DECLARE @DB sysname 

DECLARE curDB CURSOR FORWARD_ONLY STATIC FOR 
   SELECT [name] 
   FROM master..sysdatabases
   WHERE [name] NOT IN ('model', 'tempdb')
   ORDER BY [name]
    
OPEN curDB 
FETCH NEXT FROM curDB INTO @DB 
WHILE @@FETCH_STATUS = 0 
   BEGIN 
       SELECT @SQL = 'USE ['+@DB+']'+CHAR(13)+'EXEC sp_updatestats'+CHAR(13) 
       PRINT @SQL 
       EXEC (@SQL) 
       FETCH NEXT FROM curDB INTO @DB 
   END 
   
CLOSE curDB 
DEALLOCATE curDB

(Quelle)


Um das ganze als Stored Procedure zu hinterlegen und regelmäßig aufzurufen, z. B. von einer geplanten Aufgabe, z. B. folgendes machen:

USE [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[expressmaint_uwekeim]
AS
BEGIN
	SET NOCOUNT ON;

	-- https://entwicklergate.de/t/alle-statistiken-und-indexe-einer-sql-server-datenbank-aktualisieren/483/2?u=uwekeim
	DECLARE @SQL VARCHAR(1000) 
	DECLARE @DB sysname 

	DECLARE curDB CURSOR FORWARD_ONLY STATIC FOR 
	   SELECT [name] 
	   FROM master..sysdatabases
	   WHERE [name] NOT IN ('model', 'tempdb')
	   ORDER BY [name]
    
	OPEN curDB 
	FETCH NEXT FROM curDB INTO @DB 
	WHILE @@FETCH_STATUS = 0 
	   BEGIN 
		   SELECT @SQL = 'USE ['+@DB+']'+CHAR(13)+'EXEC sp_updatestats'+CHAR(13) 
		   PRINT @SQL 
		   EXEC (@SQL) 
		   FETCH NEXT FROM curDB INTO @DB 
	   END 
   
	CLOSE curDB 
	DEALLOCATE curDB
END

In diesem Kontext ist oft auch hilfreich die Stored Procedure sp_refreshview jeweils mit aufzurufen.