Anbei ein kleines Skript, welches in der Erstversion bereits einige Steuerungsmöglichkeiten enthält.
USE [MyDatabase] GO --------------------------------------------------- -- Produced By : Stefan Perner -- URL : www.sqlwithpleasure.blogspot.co.at -- Author : Stefan Perner -- Date : 2015-07-17 -- Purpose : Database Maintenance - Statisticupdate -- Modifications : no changes, as perfect ------------------------------------------------------------ /*#####################################################################*/ /*############ DIESE WERTE VOR DER AUSFÜHRUNG ÄNDERN ! ################*/ /*#####################################################################*/ DECLARE @Resample int = 0;
-- 0|1 Schalter - wenn 1, erfolgt der StatUpd. mit Resample,
-- und somit wie bei der letzten Durchführung
-- wenn 0, wird nach Satzanz. gesteuert, wieviele gesampelt werden.
DECLARE @Exec int = 0;
-- 0|1 Schalter - wenn 1, wird das SQL auch ausgeführt,
--0 ist nur für Analyse DECLARE @Print int = 1;
-- 0|1 Schalter - wenn 1, wird das SQL zusätzlich ausgegeben
/*######################################################################*/
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @SatzanzahlVeraendert int = 0;
DECLARE @Satzanzahl int = 0;
DECLARE @SchemaName nvarchar(130);
DECLARE @TableName nvarchar(130);
DECLARE @IndexName nvarchar(130);
DECLARE @Command nvarchar(4000);
/*
Für den Statistikupdate relevante Daten ermitteln
Einschränkung auf Indizes, welche überhaupt veränderte Daten haben,
Microsoft interne Indizes werden ausgeschlossen
Optional kann hier eingeschränkt werden, dass nur Indizes mit einer mind./max. Anzahl
von Sätzen berücksichtigt werden
*/
SELECT sSchem.name AS SchemaName
, sTab.name AS TableName
, sInd.name AS IndexName
, ssInd.rowcnt AS Satzanzahl
, ssInd.rowmodctr AS SatzanzahlVeraendert
INTO #IndizesFuerUpdateStatistic
FROM sys.indexes AS sInd
INNER JOIN sys.sysindexes AS ssInd
ON sInd.object_id = ssInd.id
AND sInd.name = ssInd.name
INNER JOIN sys.tables AS sTab
ON sTab.[object_id] = sInd.[object_id]
INNER JOIN sys.schemas AS sSchem
ON sSchem.[schema_id] = sTab.[schema_id]
WHERE sTab.is_ms_shipped = 0 -- Only application indexes
AND ssInd.rowcnt > 100 -- Only indexes with at least 100 rows
AND ssInd.rowmodctr > 0 -- Only indexes with changed data
-- Cursor deklarieren und öffnen
DECLARE C_Indizes CURSOR FOR SELECT * FROM #IndizesFuerUpdateStatistic;
OPEN C_Indizes;
-- Schleife zum abarbeiten der Statistikupdates - hier wird auch gesteuert,
-- wie die Statisticupdates durchgeführt werden.
WHILE (1=1)
BEGIN;
FETCH NEXT
FROM C_Indizes
INTO @SchemaName, @TableName, @IndexName, @Satzanzahl, @SatzanzahlVeraendert;
BEGIN TRY
IF @@FETCH_STATUS < 0 BREAK; -- wenn kein Satz mehr im Cursor, dann Schleife verlassen
SET @Command = N'UPDATE STATISTICS '
+ QUOTENAME(@SchemaName)
+ N'.'
+ QUOTENAME(@TableName)
+ N' '
+ QUOTENAME(@IndexName)
IF @Resample = 1
BEGIN
SET @Command = @Command + N' WITH RESAMPLE';
END
ELSE IF @Resample = 0
BEGIN
SET @Command = @Command
+ N' WITH SAMPLE '
+ CASE
WHEN @Satzanzahl < 100000 THEN N'100 PERCENT'
WHEN @Satzanzahl < 500000 THEN N'50 PERCENT'
WHEN @Satzanzahl < 10000000 THEN N'25 PERCENT'
WHEN @Satzanzahl < 30000000 THEN N'10 PERCENT'
WHEN @Satzanzahl < 50000000 THEN N'5 PERCENT'
WHEN @Satzanzahl < 100000000 THEN N'1 PERCENT'
ELSE N'500000 ROWS '
END
END
--
SET @Command = @Command + N' -- ' + CAST(@Satzanzahl AS VARCHAR(22)) + N' rows'
--
IF @Print = 1
PRINT N'Abzusetzendes Statement: ' + @Command
--
IF @Exec = 1
EXEC (@Command)
--
BEGIN TRAN
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
PRINT 'ERROR ENCOUNTERED'
END CATCH
END; -- Ende der Schleife!
-- Cursor schließen und auch deallokieren
CLOSE C_Indizes;
DEALLOCATE C_Indizes;
DROP TABLE #IndizesFuerUpdateStatistic
Keine Kommentare:
Kommentar veröffentlichen