Nachdem wir uns nun angeschaut haben, wie man eine relationale Partitionierung einrichtet und uns die Switch-Function angeschaut haben, kommen wir jetzt zu weiteren Möglichkeiten, die eine Partitionierung einer Tabelle mit sich bringt. In diesem Post soll es um die beiden Funktionen Merge und Split gehen.
Anwendungsbeispiele:
In unserem Beispiel mit den ProductInventories könnte man sich vorstellen, das wir kurz nach dem Jahreswechsel die Inhalte der Current-Partition Filegroup in die Hist-Partition Filegroup verschieben möchten.
Für das Simulieren benötigen wir noch weitere Testdaten, damit wir für 2014 das Jahr mit Daten vollmachen können. Ich stelle die vorbereitenden Skripte für dieses Beispiel hier zur Verfügung.
- -- Daten Insert in FactProductInventory ab 07.2014 bis 12.2014v
- INSERT INTO dbo.[FactProductInventory]
- SELECT
- [ProductKey]
- ,[DateKey]+10000 AS [Datekey] -- + 1Jahr
- ,DATEADD(dd,365,[MovementDate]) AS [MovementDate]
- ,CAST([UnitCost] * 1.03 AS DECIMAL(18,2)) AS [UnitCost]
- ,[UnitsIn]
- ,[UnitsOut]
- ,[UnitsBalance] * 1.03 AS [UnitsBalance]
- FROM [dbo].[FactProductInventory]
- WHERE DateKey between 20130701 and 20131231
Zunächst müssen wir die letzte Partition „aufsplitten“. Aus einer Partition machen wir zwei.
- -- 1. Partition-Split auf die leere 2015er Partition, Cur-Filegroup wird verwendet.
- ALTER PARTITION SCHEME [PSProductInventoriesRight] NEXT USED [ProductInventoriesCur]
- ALTER PARTITION FUNCTION PFYearsRight() SPLIT RANGE (20160000) -- > + 1 Jahr
- -- 2. Aufteilung der Daten auf die jeweiligen Partitionen anschauen
- USE [AdventureWorksDW2014]
- GO
- SELECT DISTINCT
- --SysTables.object_id as [OBJECT_ID]
- --,object_schema_name(SysPartitions.object_id) as [TABLE_SCHEMA]
- SysTables.name AS [TABLE_NAME]
- ,SysPartitions.partition_number AS [PARTITION_NUMBER]
- ,SysRangeValue.VALUE AS [PARTITIONCOLUMNID_FROM]
- ,SysRangeValue.boundary_id AS [BOUNDARY_ID]
- ,SysPartitions.ROWS AS [PARTITION_ROWS]
- ,SysPartitionFunctions.name AS [PARTITION_FUNCTION]
- ,SysSchemes.name AS [PARTITION_SCHEMA]
- ,[SysFileGroups].name AS [PARTITION_FILEGROUP]
- FROM sys.partitions AS [SysPartitions]
- INNER join sys.indexes AS [SysIndizes]
- ON SysPartitions.OBJECT_ID = SysIndizes.OBJECT_ID
- and SysPartitions.index_id = SysIndizes.index_id
- INNER join sys.tables AS SysTables
- ON SysPartitions.OBJECT_ID = SysTables.OBJECT_ID
- INNER join sys.partition_schemes AS SysSchemes
- ON SysIndizes.data_space_id = SysSchemes.data_space_id
- INNER join sys.partition_functions AS SysPartitionFunctions
- ON SysPartitionFunctions.function_id = SysSchemes.function_id
- INNER join sys.partition_range_values AS SysRangeValue
- ON SysRangeValue.function_id = SysSchemes.function_id
- and SysPartitions.partition_number-1 = SysRangeValue.boundary_id
- INNER join sys.allocation_units AS [SysAllocationUnits]
- ON [SysAllocationUnits].container_id = [SysPartitions].hobt_id
- INNER join sys.filegroups AS [SysFileGroups]
- ON [SysFileGroups].data_space_id = [SysAllocationUnits].data_space_id
- WHERE [SysTables].name = 'FactProductInventory'
- ORDER BY SysTables.name
Als nächstes fügen wir Testdaten für Januar/2015 ein.
HINWEIS: Bei der Erstellen des Beispiels hatte ich nicht an den DimDate-ForeignKey in der Tabelle gedacht. Dieser würde das Einfügen der Testdaten verhindern, da in der DimTime Tabelle diese Einträge fehlen. Deshalb bitte vorher den ForeignKey-Constraint für das durchführen des Beispiels entfernen.
- -- Januar 2015 Werte einfügen -- Vorher muss der ForeignKey Constraints von DateKey genommen werden. DimDate enthält nur Daten bis 2014.
- INSERT INTO [dbo].[FactProductInventory]
- SELECT
- [ProductKey]
- ,[DateKey]+30000 AS [Datekey] -- + 3 Jahr
- ,DATEADD(dd,1095,[MovementDate]) AS [MovementDate]
- ,CAST([UnitCost] * 1.07 AS DECIMAL(18,2)) AS [UnitCost]
- ,[UnitsIn]
- ,[UnitsOut]
- ,[UnitsBalance] * 1.07 AS [UnitsBalance]
- FROM [dbo].[FactProductInventory]
- WHERE DateKey between 20120101 and 20120131
Jetzt können wir die 2014er Daten in die Hist-Filegroup „mergen“ in dem wir die 2013er und 2014 Partitionen zusammenziehen. Erst danach machen wir einen Split auf die 2014er Partition. Wichtig hierbei ist die Filegroup mit „NEXT USED“ für die 2014er Partition zu ändern.
- -- Die 2014er Daten sollen nun in die Hist Filegroup verschoben werden
- -- Die Partition 20140000 in die 2013er mergen
- ALTER PARTITION FUNCTION PFYearsRight() MERGE RANGE (20140000)
- -- Dann per Split wieder erzeugen. Diesmal aber in die Hist-Filegroup
- ALTER PARTITION SCHEME [PSProductInventoriesRight] NEXT USED [ProductInventoriesHist]
- ALTER PARTITION FUNCTION PFYearsRight() SPLIT RANGE (20140000)