Schlagwort-Archiv Merge

Relationale Partitionierung #3 – Partition Merge+Split

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.

  1. -- Daten Insert in FactProductInventory ab 07.2014 bis 12.2014v
  2. INSERT INTO dbo.[FactProductInventory]
  3. SELECT
  4. [ProductKey]
  5. ,[DateKey]+10000 AS  [Datekey]            -- + 1Jahr
  6. ,DATEADD(dd,365,[MovementDate])  AS [MovementDate]
  7. ,CAST([UnitCost] * 1.03 AS DECIMAL(18,2)) AS [UnitCost]
  8. ,[UnitsIn]
  9. ,[UnitsOut]
  10. ,[UnitsBalance] * 1.03        AS [UnitsBalance]
  11. FROM [dbo].[FactProductInventory]
  12. WHERE DateKey between 20130701 and 20131231

Zunächst müssen wir die letzte Partition „aufsplitten“. Aus einer Partition machen wir zwei.

  1. -- 1. Partition-Split auf die leere 2015er Partition, Cur-Filegroup wird verwendet.
  2. ALTER PARTITION SCHEME [PSProductInventoriesRight] NEXT USED [ProductInventoriesCur]
  3. ALTER PARTITION FUNCTION PFYearsRight() SPLIT RANGE (20160000)  -- > + 1 Jahr
  4. -- 2. Aufteilung der Daten auf die jeweiligen Partitionen anschauen
  5. USE [AdventureWorksDW2014]
  6. GO
  7. SELECT DISTINCT
  8. --SysTables.object_id                                    as [OBJECT_ID]
  9. --,object_schema_name(SysPartitions.object_id)        as [TABLE_SCHEMA]
  10. SysTables.name                                        AS [TABLE_NAME]
  11. ,SysPartitions.partition_number                        AS [PARTITION_NUMBER]
  12. ,SysRangeValue.VALUE                                AS [PARTITIONCOLUMNID_FROM]
  13. ,SysRangeValue.boundary_id                            AS [BOUNDARY_ID]
  14. ,SysPartitions.ROWS                                    AS [PARTITION_ROWS]
  15. ,SysPartitionFunctions.name                            AS [PARTITION_FUNCTION]
  16. ,SysSchemes.name                                    AS [PARTITION_SCHEMA]
  17. ,[SysFileGroups].name                                AS [PARTITION_FILEGROUP]
  18. FROM sys.partitions AS [SysPartitions]
  19. INNER join sys.indexes AS [SysIndizes]
  20. ON SysPartitions.OBJECT_ID = SysIndizes.OBJECT_ID
  21. and SysPartitions.index_id = SysIndizes.index_id
  22. INNER join sys.tables AS SysTables
  23. ON SysPartitions.OBJECT_ID = SysTables.OBJECT_ID
  24. INNER join sys.partition_schemes AS SysSchemes
  25. ON SysIndizes.data_space_id = SysSchemes.data_space_id
  26. INNER join sys.partition_functions AS SysPartitionFunctions
  27. ON SysPartitionFunctions.function_id = SysSchemes.function_id
  28. INNER join sys.partition_range_values AS SysRangeValue
  29. ON SysRangeValue.function_id = SysSchemes.function_id
  30. and SysPartitions.partition_number-1 = SysRangeValue.boundary_id
  31. INNER join sys.allocation_units AS [SysAllocationUnits]
  32. ON [SysAllocationUnits].container_id = [SysPartitions].hobt_id
  33. INNER join sys.filegroups AS [SysFileGroups]
  34. ON [SysFileGroups].data_space_id = [SysAllocationUnits].data_space_id
  35. WHERE [SysTables].name = 'FactProductInventory'
  36. 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.

  1. -- Januar 2015 Werte einfügen -- Vorher muss der ForeignKey Constraints von DateKey genommen werden. DimDate enthält nur Daten bis 2014.
  2. INSERT INTO [dbo].[FactProductInventory]
  3. SELECT
  4. [ProductKey]
  5. ,[DateKey]+30000 AS  [Datekey]            -- + 3 Jahr
  6. ,DATEADD(dd,1095,[MovementDate])  AS [MovementDate]
  7. ,CAST([UnitCost] * 1.07 AS DECIMAL(18,2)) AS [UnitCost]
  8. ,[UnitsIn]
  9. ,[UnitsOut]
  10. ,[UnitsBalance] * 1.07        AS [UnitsBalance]
  11. FROM [dbo].[FactProductInventory]
  12. 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.

  1. -- Die 2014er Daten sollen nun in die Hist Filegroup verschoben werden
  2. -- Die Partition 20140000 in die 2013er mergen
  3. ALTER PARTITION FUNCTION PFYearsRight() MERGE RANGE (20140000)
  4. -- Dann per Split wieder erzeugen. Diesmal aber in die Hist-Filegroup
  5. ALTER PARTITION SCHEME [PSProductInventoriesRight] NEXT USED [ProductInventoriesHist]
  6. ALTER PARTITION FUNCTION PFYearsRight() SPLIT RANGE (20140000)