Einstellungen für Datenbankdefragmentierung und automatisches Wachstum


7

Wir haben einen Wartungsplan für unseren SQL Server 2008 r2 Express. Jeden Monat wird die Datenbank defragmentiert, wenn eine Tabelle eine Seitenzahl von mehr als 50 für eine Tabelle und eine durchschnittliche Fragmentierung von mehr als 20 aufweist.

Wenn die Datenbankprotokollgröße> 2 MB ist, wird der Wiederherstellungsmodus vereinfacht, verkleinert und der Wiederherstellungsmodus auf VOLL zurückgesetzt. Wenn Page_count> 50 und avg_fragmentation_in_percent> 30 sind, lautet der Index REBUILD.

Und wenn Page_count> 50 und avg_fragmentation_in_percent> 5 und <30 sind, lautet der Index REORGANIZE.

Dies ist, was wir bis jetzt tun. Aber wir haben festgestellt, dass Autogrowth-Ereignisse ressourcenintensiv sind und nicht wiederholt auftreten sollten. Jetzt wird für alle Datenbanken das automatische Wachstum für die MDF-Datei auf MB und für die ldf-Datei auf 10% festgelegt. Dies ist der Standardwert beim Erstellen einer neuen Datenbank. Wir planen, die Werte für das automatische Wachstum der Datenbank zu erhöhen, je nachdem, wie viel Datenbank jeden Tag größer wird Ich möchte wissen, wie viele Autogrowth-Ereignisse für die Datenbank ideal sind. Soll ich Autogroth so einstellen, dass es nur einmal am Tag, in der Woche oder im Monat usw. auftritt? Bitte helfen Sie mir, den Autogrowth-Wert für meine Datenbank festzulegen. Es gibt auch ein anderes Problem, wenn ich die Datenbank monatlich entfragmentiere, wird sie verkleinert. Danach tritt für alle Datenbanken, für die ich das Autogrowth verkleinert habe, einmal auf, wenn neue Daten darauf geschrieben werden. Es wird also so viele Autogrowth-Ereignisse geben. Also, ob es ein Problem sein wird? Bitte sagen Sie mir eine Lösung.

Antworten:


13

Wenn eine Tabelle eine Seitenzahl von mehr als 50 hat.

Das ist immer noch extrem klein. Ich berücksichtige normalerweise keine Fragmentierung für einen Index mit weniger als 1000 Seiten .

und avg_fragmentation_in_percent> 30, dann ist der Index REBUILD

Das ist ein guter Schwellenwert für Neuerstellungen, aber ich würde auch in Betracht ziehen, Indizes mit einer Fragmentierung im Bereich von 5% bis 30% neu zu organisieren.

Wenn die Datenbankprotokollgröße> 2 MB ist, wird der Wiederherstellungsmodus vereinfacht, verkleinert und der Wiederherstellungsmodus auf VOLL zurückgesetzt

Warum tust du das? Warum ist es ein Problem, wenn eine Protokolldatei größer als 2 MB ist? Das ist extrem klein. Ganz zu schweigen davon, dass Sie die Protokollkette unterbrechen , wenn Sie zu wechseln SIMPLE, schrumpfen und dann zur FULLWiederherstellung zurückkehren. Sie könnten ernsthafte Probleme bekommen, wenn Sie sich zu einem bestimmten Zeitpunkt erholen. Passen Sie die Größe Ihrer Protokolldateien entsprechend an und lassen Sie das automatische Wachstum nur im Notfall zu . Das Verkleinern einer Datenbankdatei sollte nur in extrem seltenen Fällen erfolgen und ist keinesfalls Teil eines routinemäßigen Wartungsplans.

Wir haben jedoch festgestellt, dass Autogrowth-Ereignisse einen Anreiz für Ressourcen darstellen und nicht wiederholt auftreten sollten

Richtig. Hier kommt die Dimensionierung ins Spiel. Überwachen Sie und werden Sie benachrichtigt, wenn ein bestimmter Prozentsatz des Speicherplatzes verwendet wird. Auf diese Weise können Sie Ihre manuellen Dateierwuchsvorgänge für ein Wartungsfenster planen, um die Auswirkungen auf den Endbenutzer zu minimieren.

und 10% für die ldf-Datei, die beim Erstellen einer neuen Datenbank der Standardwert ist

Obwohl ein prozentuales Dateiwachstum standardmäßig ist, empfehle ich dagegen. Sie möchten keine variable Menge an Dateiwachstum haben. Wenn Sie auf Autogrowth zurückgreifen müssen, möchten Sie genau wissen, um wie viel die Datei wächst. Ganz zu schweigen davon, dass Sie mit dem Wachstum einer Protokolldatei eine variable Anzahl virtueller Protokolldateien (VLF) mit zusätzlichem Speicherplatz haben. Sie möchten dies intelligent planen, und dies kann durch ein festes Dateiwachstum erfolgen.

Sollte ich Autogroth so einstellen, dass es nur einmal am Tag, in der Woche oder im Monat usw. Geschieht?

Stellen Sie das automatische Wachstum für eine feste Menge an Speicherplatz (nicht in Prozent) ein, und nur Sie können bestimmen, was eine gute Menge ist. Zu klein, Sie haben häufiges Autogrowth mit minimalen Auswirkungen auf den Endbenutzer, aber es kommt häufig vor. Wenn das Autogrowth zu hoch eingestellt ist, werden Sie weniger häufig wachsen, aber wenn es passiert, wird die Auswirkung länger dauern.

Meine Empfehlung? Überwachen Sie den in Ihren Datenbankdateien verwendeten Speicherplatz. Wenn ein bestimmter Prozentsatz erreicht wird (z. B. 80% des genutzten Speicherplatzes), sollten Sie benachrichtigt werden. Und dann planen Sie ein manuelles Wachstum während eines Wartungsfensters.


3
Wenn Sie das automatische Wachstum aktivieren möchten, sollten Sie sich auch mit der sofortigen Dateiinitialisierung befassen . Es funktioniert nur für Datendateien, macht jedoch das Wachstumsereignis weitaus weniger intensiv.
Kenneth Fisher

2
@KennethFisher Ich stimme Ihnen zu 1000% zu. IFI ist ein schneller und einfacher großer Gewinn mit Datendateien.
Thomas Stringer

@ThomasStringer Kannst du bitte sagen, wie oft Autogrowth auftreten soll? Nur um das automatische Wachstum für meine Datenbanken festzulegen, wollte ich es wissen (ich weiß, dass es keine bestimmten Regeln gibt, nach denen das automatische Wachstum nur für eine begrenzte Zeit erfolgen kann).
IT-Forscher

@ThomasStringer Nach dem Verkleinern der Datenbank erstelle ich den Index neu oder reorganisiere ihn. Außerdem mache ich auch eine vollständige Sicherung der Datenbank, damit die Logchain nicht bricht.
IT-Forscher

7

Die Punkte von Thomas Stringer sind alles, was Sie für Ihre Antwort benötigen. Aber ich würde noch einen Einblick geben, wie Sie Ihre Einstellungen für das automatische Wachstum bestimmen.

Aber ich möchte wissen, wie viele Autogrowth-Ereignisse für die Datenbank ideal sind. Soll ich Autogroth so einstellen, dass es nur einmal am Tag, in der Woche oder im Monat usw. auftritt? Bitte helfen Sie mir, den Autogrowth-Wert für meine Datenbank festzulegen. Es gibt auch ein anderes Problem. Wenn ich die Datenbank monatlich defragmentiere, wird sie verkleinert. Danach tritt für alle Datenbanken, für die ich das Autogrowth verkleinert habe, einmal auf, wenn neue Daten darauf geschrieben werden. Es wird also so viele Autogrowth-Ereignisse geben. Also, ob es ein Problem sein wird?

Es gibt keine mathematische Formel zum Berechnen Ihrer Einstellungen für das automatische Wachstum, insbesondere wenn Sie keine Basislinie Ihrer Datenbanken erstellen.

Nun, da @ThomasStringer darauf hingewiesen hat, dass Sie das automatische Wachstum Ihrer Datenbank nicht in% zulassen sollten, sondern auf MB setzen sollten, können Sie mithilfe der Standardablaufverfolgung herausfinden, ob auf Ihrer Serverinstanz Autogrowth-Ereignisse auftreten .

--below code will help you in finding autogrowth events on your server instance.
IF OBJECT_ID('tempdb..#autogrowthTotal') IS NOT NULL
    DROP TABLE #autogrowthTotal;

IF OBJECT_ID('tempdb..#autogrowthTotal_Final') IS NOT NULL
    DROP TABLE #autogrowthTotal_Final;

DECLARE @filename NVARCHAR(1000);
DECLARE @bc INT;
DECLARE @ec INT;
DECLARE @bfn VARCHAR(1000);
DECLARE @efn VARCHAR(10);

-- Get the name of the current default trace
SELECT @filename = CAST(value AS NVARCHAR(1000))
FROM::fn_trace_getinfo(DEFAULT)
WHERE traceid = 1
    AND property = 2;

-- rip apart file name into pieces
SET @filename = REVERSE(@filename);
SET @bc = CHARINDEX('.', @filename);
SET @ec = CHARINDEX('_', @filename) + 1;
SET @efn = REVERSE(SUBSTRING(@filename, 1, @bc));
SET @bfn = REVERSE(SUBSTRING(@filename, @ec, LEN(@filename)));
-- set filename without rollover number
SET @filename = @bfn + @efn

-- process all trace files
SELECT ftg.StartTime
    ,te.NAME AS EventName
    ,DB_NAME(ftg.databaseid) AS DatabaseName
    ,ftg.[FileName] AS LogicalFileName
    ,(ftg.IntegerData * 8) / 1024.0 AS GrowthMB
    ,(ftg.duration / 1000) AS DurMS
    ,mf.physical_name AS PhysicalFileName
INTO #autogrowthTotal
FROM::fn_trace_gettable(@filename, DEFAULT) AS ftg
INNER JOIN sys.trace_events AS te ON ftg.EventClass = te.trace_event_id
INNER JOIN sys.master_files mf ON (mf.database_id = ftg.databaseid)
    AND (mf.NAME = ftg.[FileName])
WHERE (
        ftg.EventClass = 92 -- Data File Auto-grow
        OR ftg.EventClass = 93
        ) -- Log File Auto-grow
ORDER BY ftg.StartTime

SELECT count(1) AS NoOfTimesEventFired
    ,CONVERT(VARCHAR(10), StartTime, 120) AS StartTime
    ,EventName
    ,DatabaseName
    ,[LogicalFileName]
    ,PhysicalFileName
    ,SUM(GrowthMB) AS TotalGrowthMB
    ,SUM(DurMS) AS TotalDurationMS
INTO #autogrowthTotal_Final
FROM #autogrowthTotal
GROUP BY CONVERT(VARCHAR(10), StartTime, 120)
    ,EventName
    ,DatabaseName
    ,[LogicalFileName]
    ,PhysicalFileName
--having count(1) > 5 or SUM(DurMS)/1000 > 60 -- change this for finetuning....
ORDER BY CONVERT(VARCHAR(10), StartTime, 120)

SELECT *
FROM #autogrowthTotal_Final

Unten wird die Ausgabe sein

Geben Sie hier die Bildbeschreibung ein

Hinweis: Ich habe im Bild hervorgehoben, was jede Spalte bedeutet und wonach Sie suchen sollten.

Grundsätzlich müssen Sie Ihre Autogrowth-Ereignisse für einen bestimmten Zeitraum überwachen, z. B. während einer hohen Aktivität oder für Ihren gesamten Geschäftszyklus. Durch Mittelwertbildung erhalten Sie einen genauen Wert, den Sie für die Autogrowth-Einstellungen auswählen können.

Für die Protokolldatei müssen Sie jetzt auch Faktoren wie die Indexpflege, die Ausführung von CHECKDB usw. berücksichtigen. Passen Sie daher die Größe der Protokolldatei an, um das Volumen der in der Datenbank auftretenden Datenänderungen zu unterstützen, und führen Sie häufig Protokollsicherungen durch, um eine schnelle Wiederverwendung des Speicherplatzes zu ermöglichen innerhalb der Protokolldatei.

Erwähnenswert ist auch, dass Sie auch die sofortige Dateiinitialisierung aktivieren sollten . Funktioniert nur für Datendateien!

Siehe Wichtigkeit der Verwaltung der Datendateigröße, insbesondere das Wachstum von Datendateien und das Verkleinern von Datendateien von Paul Randal.

Hinweis: Verkleinern Sie Ihre Datenbank nicht, es sei denn, Sie bereinigen Ihre Daten massiv und sind sicher, dass die Datenbank nicht wieder so groß wird. Es verursacht Fragmentierung und Datenbanken sollen wachsen!


Ich finde die Standardablaufverfolgung die meiste Zeit deaktiviert. Ich finde es einfacher, mit DMV in SQL 2005+ oder sysperfinfo in SQL 2000 ein Protokollwachstum zu

@ShawnMelton Sie müssen auch die Vorteile der Standardablaufverfolgung berücksichtigen. DMVs sind ab 2005 großartig, werden jedoch jedes Mal zurückgesetzt, wenn der SQL Server neu gestartet wird oder wenn die Datenbank offline ist. Die Standardablaufverfolgung ist standardmäßig aktiviert und ist eine sehr leichte Ablaufverfolgung mit maximal 5 Dateien, die im Laufe der Zeit verlängert werden. Siehe simple-talk.com/sql/performance/… . Hinweis: Ich sage nicht, dass Sie keine DMVs verwenden sollten, aber die gleichen Informationen können mit weniger Berechnung und Codierung erhalten werden. Warum nicht nutzen?
Kin Shah

Außerdem erhalten Sie nicht die Start- und Endzeit der Ereignisse.
Kin Shah
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.