Warum lautet der Status "DbccFilesCompact" "Angehalten"?


11

Ich führe eine SHRINK-Datei auf einer 600G-Datendatei aus.

Derzeit wird der Status als "angehalten" gemeldet und sys.dm_exec_requests.percent_completebei DbccFilesCompactBefehlsmeldungen wird er ausgeführt (jedoch sehr langsam).

Gibt es eine Möglichkeit zu überprüfen, warum es ausgesetzt wird und wie es reibungsloser läuft?


FYI - SQL-Abfrage zum Überprüfen des Status

select T.text, R.Status, R.Command, DatabaseName = db_name(R.database_id)
       , R.cpu_time, R.total_elapsed_time, R.percent_complete
from   sys.dm_exec_requests R
       cross apply sys.dm_exec_sql_text(R.sql_handle) T
order by Command

Antworten:


10

Nein, Sie können nicht überprüfen, warum es langsam läuft, aber ich kann Ihnen einige Hinweise geben:

1) In SQL 2005 wurde die Verwaltung von nicht gruppierten Indizes von der Storage Engine (meinem Team) zum Abfrageprozessor geändert. Dies hat viele Nebenwirkungen, von denen eine die Geschwindigkeit ist, mit der Heap-Datenseiten durch Verkleinern verschoben werden können. Alle nicht gruppierten Indexdatensätze enthalten einen Backlink zu dem Datensatz, den sie indizieren. Im Fall eines Heaps ist dies eine physische Verknüpfung zu einer Datensatznummer auf einer bestimmten Datenseite. Wenn eine Heap-Datenseite durch Verkleinern verschoben wird, müssen alle nicht gruppierten Indexdatensätze, die mit Datensätzen auf dieser Seite verknüpft sind, mit dem neuen Speicherort der Seite aktualisiert werden. Im Jahr 2000 wurde dies von der Storage Engine selbst sehr effizient durchgeführt. Ab 2005 muss dies durch Aufrufen des Abfrageprozessors erfolgen, um die nicht gruppierten Indexdatensätze zu aktualisieren. Dies ist manchmal bis zu 100-mal langsamer als im Jahr 2000.

2) Off-Row-LOB-Werte (entweder tatsächliche LOB-Datentypen oder Zeilenüberlaufdaten) enthalten keinen Backlink zu den Daten oder Indexdatensätzen, zu denen sie gehören. Wenn eine Seite mit LOB-Datensätzen verschoben wird, muss die gesamte Tabelle oder der Index, zu dem sie gehören, gescannt werden, um herauszufinden, welche Daten / Indexdatensätze auf sie verweisen, damit sie mit dem neuen Speicherort aktualisiert werden können. Das ist auch sehr, sehr langsam.

3) Möglicherweise wird die Datenbank von einem anderen Prozess verwendet, der das Schrumpfen blockiert und auf die Sperren wartet, die zum Verschieben von Seiten erforderlich sind.

4) Möglicherweise ist die Snapshot-Isolation aktiviert, und durch das Verkleinern können Seiten mit Versionsspeicher-Links erst verschoben werden, wenn die Transaktionen abgeschlossen sind, für die diese älteren Versionen erforderlich sind.

5) Ihr E / A-Subsystem ist möglicherweise nicht ausreichend mit Strom versorgt. Eine höhere Festplattenwarteschlangenlänge als niedrige einstellige Werte bedeutet, dass sich Ihr E / A-Subsystem im Engpass befindet.

Einige oder alle davon können zu langsamen Schrumpflaufzeiten beitragen.

Im Allgemeinen möchten Sie jedoch nicht schrumpfen. Weitere Informationen finden Sie in diesem Blogbeitrag: Warum Sie Ihre Datendateien nicht verkleinern sollten .

Hoffe das hilft!


1
@ Paul Randal: Ich freue mich über Ihren Kommentar und den Link, warum Shrink nicht ausgeführt werden sollte, es sei denn, dies ist erforderlich. Ich werde die Empfehlung ausprobieren (Dateien in eine andere Dateigruppe verschieben) und sehen, wie es ausgeht.
Dance2die

8

Sie können dieses Skript ausführen, um den Prozentsatz der Fertigstellung zu überprüfen!

SELECT 
    percent_complete, 
    start_time, 
    status, 
    command, 
    estimated_completion_time, 
    cpu_time, 
    total_elapsed_time
    --,*
FROM 
    sys.dm_exec_requests
WHERE
    command = 'DbccFilesCompact'

2

Ich verkleinere eine Datenbank in SQL Server 2008 SP1 und eine Möglichkeit, den Fortschritt des Befehls "Verkleinern" zu erkennen, besteht darin, sp_lock spid auszuführen. Zum größten Teil kann ich sehen, dass Datei 1 gesperrt wird, und wenn ich fertig bin, wird a gesetzt Sperren Sie die Datei-ID 2 und so weiter. Auf diese Weise kann ich feststellen, wann die letzte Datei-ID bearbeitet wird. Dies ist mein Hinweis darauf, dass sie fast vollständig ist.

Vielen Dank,

Alex Aguilar


Wie groß ist deine Datenbank?
John Zabroski

0

Ich habe das Problem entdeckt (in meinem Fall) und biete hier die Lösung an, die ich verwendet habe.

Ich hatte nichts mit der Datenbank und Master war die Standarddatenbank in meiner Sitzung. Ich habe dies mit sp_who2 überprüft. Dann habe ich mit der rechten Maustaste auf die Datenbank geklickt, "Aufgaben" ausgewählt und dann "verkleinern" und auf "OK" den Dialog. Wenn Sie erneut mit sp_who2 prüfen, wird der Status um einige Minuten "ausgesetzt" und danach abgebrochen, da "keine exklusive Sperre erhalten werden kann". Erraten Sie sich selbst, aber ich bin sicher, dass der Dialog selbst derjenige ist, der das verursacht.

Also entschied ich mich, über die Kommandozeile zu gehen mit:

DBCC SHRINKDATABASE (myDataBase)

(Hexe ist überall dokumentiert), Dann dauerte der Schrumpf nur wenige Sekunden.


1
DBCC SHRINKDATABASEsollte vermieden werden, da dadurch alle Dateien für die Datenbank verkleinert werden - alle Datendateien und alle Protokolldateien.
Zac Faragher

Einverstanden. Wir verwenden es nur in Entwicklungsumgebungen. Praktisch, um Speicherplatz in AWS zu sparen, wo die Festplatte gemessen wird.
John Zabroski
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.