DBCC CHECKTABLE dauert mehr als 15 Minuten, um auf einem leeren Tisch zu laufen

7

Ich habe eine Datenbank, in der DBCC CHECKTABLE für eine Reihe kleiner oder leerer Tabellen über 15 Minuten dauert. Wenn es fertig ist, gibt es keine Fehler oder Irrtümer. Die Leistung für alles andere auf dem Server ist sehr akzeptabel. Es lief nichts anderes zur gleichen Zeit.

Ich habe auch DBCC CLEANTABLE ausprobiert und Statistiken mit Fullscan aktualisiert.

Ich verwende SQL Server 2016 Enterprise Edition (13.0.5201.2).

Beispieltabelle:

CREATE TABLE [Schema1].[Table1](
    [col1] [int] NOT NULL,
    [col2] [nvarchar](100) NOT NULL,
    [col3] [xml] NOT NULL,
 CONSTRAINT [PK_1] PRIMARY KEY CLUSTERED 
(
    [col1] ASC,
    [col2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Russ960
quelle

Antworten:

6

Am Ende habe ich einen Vorfall mit Microsoft eröffnet und festgestellt, dass die sys.sysrscols (auf die nur über DAC zugegriffen werden kann) über 200 Millionen Zeilen hatten. Nach einer Überprüfung wurde festgestellt, dass SQL Server als Teil von DBCC immer Überprüfungen von Systemtabellen durchführt, auch für DBCC CHECKTABLE. Aus dem DBCC CHECKTABLE-Handbuch :

Integritätsprüfungen werden immer für alle Systemtabellenindizes durchgeführt.

Meines Wissens nach führt sys.sysrscols einige Spalten nach und der Grund für die große Größe ist eine Anzahl von Tabellen (200+) mit mehr als 2.000 Partitionen und 163 Spalten. Fast alle von ihnen waren temporäre Arbeitstische, die von der Anwendung hätten gelöscht werden sollen, aber nicht. Ich löschte sie und der Prozess kehrte zu einer normalen Antwortzeit für eine leere Tabelle von weniger als 1 Minute zurück.

Sie stellten außerdem fest, dass in der Dokumentation aufgeführt ist, dass Partitionen Auswirkungen auf DBCC-Prüfungen haben können. Aus partitionierten Tabellen und Indizes :

DBCC-Befehle

Bei einer größeren Anzahl von Partitionen kann die Ausführung von DBCC-Befehlen mit zunehmender Anzahl von Partitionen länger dauern.

Russ960
quelle
1
Der OP-Beispielcode zeigt, dass die Tabelle ist ON [PRIMARY]. War die eigentliche Tabelle in einem Partitionsschema? Oder können Sie klarstellen, dass die Existenz von partitioniertem tableX die Verlangsamung von verursacht hat CHECKTABLE(tableY)?
Peter Vandivier
@PeterVandivier Das obige Beispiel stammt aus einer der realen Tabellen mit 0 Zeilen, die lange ausgeführt wurden. Dies war jedoch nicht die Tabelle, die die Auswirkungen verursachte, da diese Tabelle nicht leer ist. Die betreffende Tabelle mit Partitionierung hatte mehr als 2000 Partitionen, aber auch eine große Anzahl von Spalten, die ich nicht in meine Antwort aufgenommen habe. Hinzu kam die große Anzahl temporärer Tabellen, die mit demselben Partitionierungsschema erstellt wurden, wobei dieselbe große Anzahl von Zeilen die Größe von sys.sysrscols beeinflusste.
Russ960
1
Danke für die Information! 😄 Ich frage, weil ich angesichts der Beschreibung in Ihrer Antwort das Verhalten (Link), das ich aus der Antwort interpretiert habe , nicht reproduzieren konnte . Wären Sie so freundlich, einen Blick auf das Wesentliche zu werfen und zu kommentieren, was ich möglicherweise falsch interpretiert habe? Oder überarbeiten Sie vielleicht Ihren Wortlaut, um dies zu klären? Ich lade Sie auch freundlich ein, ausführlich im Chat
Peter Vandivier