Schlagwort-Archiv Schnelles Löschen von Daten

Relationale Partitionierungen von SQL Tabellen #2

Partition-Switching

Im zweiten Teil der Reihe über die relationale Partitionierung soll es um die Partion-Switch Funktion gehen.

Partition-Switch ist mit Abstand die performanteste Lösung, wenn aus einer Tabelle mit mehreren 10 Mio. Datensätzen viele Daten gelöscht werden müssen. Faktentabellen eigenen sich für den Einsatz besonders gut, weil es meistens bei dem Ladeprozess darauf ankommt, möglichst schnell die Daten in der Zieltabelle zu aktualisieren. Dieser Artikel zeigt anhand eines Beispiels wie man Daten mit Hilfe der Switch-Methode aus einer Tabelle löschen und wieder einfügen kann.

Als Beispieltabelle dient wieder die FactProductInventory-Tabelle in der AdventureWorksDW2014 Datenbank. Die Partitionierung muss für diese Tabelle eingerichtet worden sein.

Anhand dieser Tabelle erstellen wir eine neue Tabelle, die absolut identisch mit der Grundtabelle aufgebaut sein muss. Wichtig ist auch, dass das Partitionscheme das Gleiche sein muss, wie in der Grundtabelle.

CREATE TABLE [dbo].[FactProductInventorySwitch](
    [ProductKey] [INT] NOT NULL,
    [DateKey] [INT] NOT NULL,
    [MovementDate] [DATE] NOT NULL,
    [UnitCost] [MONEY] NOT NULL,
    [UnitsIn] [INT] NOT NULL,
    [UnitsOut] [INT] NOT NULL,
    [UnitsBalance] [INT] NOT NULL
) ON [PSProductInventoriesRight]([DateKey])
WITH
(
DATA_COMPRESSION = PAGE
)
GO
 
CREATE NONCLUSTERED INDEX [IXFactProductInventorySwitchDateKey] ON [dbo].[FactProductInventorySwitch]
(
    [DateKey] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION = PAGE) ON [PSProductInventories]([DateKey])
GO
 
ALTER TABLE [dbo].[FactProductInventorySwitch]  WITH CHECK ADD  CONSTRAINT [FK_FactProductInventorySwitch_DimDate] FOREIGN KEY([DateKey])
REFERENCES [dbo].[DimDate] ([DateKey])
GO
 
ALTER TABLE [dbo].[FactProductInventorySwitch] CHECK CONSTRAINT [FK_FactProductInventorySwitch_DimDate]
GO
 
ALTER TABLE [dbo].[FactProductInventorySwitch]  WITH CHECK ADD  CONSTRAINT [FK_FactProductInventorySwitch_DimProduct] FOREIGN KEY([ProductKey])
REFERENCES [dbo].[DimProduct] ([ProductKey])
GO
 
ALTER TABLE [dbo].[FactProductInventorySwitch] CHECK CONSTRAINT [FK_FactProductInventorySwitch_DimProduct]
GO

Screen6-ResultPartitionRangesBeforeSwitch

Als nächstes werden wir aus einer Partition-Range die Daten aus der Grundtabelle in die neu angelegt Switch-Tabelle verschieben.

ALTER TABLE [dbo].[FactProductInventory]
SWITCH PARTITION 1 TO [dbo].[FactProductInventorySwitch] PARTITION 1;

Screen7-ResultPartitionRangesAfterSwitch

In einem Ladeprozess würde man nun nur noch ein Truncate Table auf die Switch-Tabelle machen und schon wären die Daten aus der eigentlich Tabelle für diese Partition-Range gelöscht worden. Diese Lösung ist sowie extrem einfach also auch extrem effizient. Einfach ausprobieren! Es lohnt sich. Der Ladeprozess kann so um einen hohen Faktor schneller gemacht werden.