SQL Server vNext: Truncate Partition

26. Mai 2015

Update V12 für Azure SQL Database hat viele neue Features und Verbesserungen mitgebracht. Eine kleine aber feine Neuigkeit ist die Möglichkeit einzelne Partitionen einer Tabelle zu leeren (Microsoft Connect: Truncate Table Partition).

Das geht z.B. so (MSDN):

TRUNCATE TABLE TableName WITH (PARTITIONS (1, 30 TO 40)) 

Bis jetzt war die Handhabung besonders für Archivierung und Housekeeping-Szenarien ziemlich umständlich, da man die Zieltabellen für den Switch-Befehl entweder hartkodiert oder Metadaten gesteuert mit dynamischem SQL anlegen musste. Ab SQL Server vNext (2016) wird es auch für on-premise Instanzen nicht mehr notwendig sein.

Zusätzlich zu den schon bekannten Einschränkungen des Truncate-Befehls (Foreign Key Constraints) kommen die relevanten Einschränkungen des Switch-Befehls hinzu (wie z.B. not aligned Indexes). Die letzteren sind auf TechNet ausführlich dokumentiert.

Falls die Tabelle doch einen nonclustered Index besitzt, der anders als die Tabelle partitioniert ist, erscheint beim Truncate auf Azure SQL Database eine zuerst erschreckende Fehlermeldung

Msg 608, Level 16, State 1, Line 1

No catalog entry found for partition ID 0 in database 6. The metadata is inconsistent. Run DBCC CHECKDB to check for a metadata corruption.

Die Datenbank wird aber nicht als „suspect“ angezeigt, DBCC CHECKDB findet auch keine Fehler. Nach dem Löschen des nonclustered Indexes klappt auch das Truncate. Vermutlich handelt es sich dabei um eine generische Fehlermeldung der Storage Engine, die für den Switch-Befehl etwas sprechender aussieht:

Msg 7733, Level 16, State 4, Line 10

‘ALTER TABLE SWITCH’ statement failed. The table … is partitioned while index … is not partitioned.

Blick über den Tellerrand: Oracle TRUNCATE PARTITION