Hans Klüser

Mit StretchDB hat Microsoft dem SQL Server 2016 ein Feature hinzugefügt, das eine nahezu beliebige Erweiterung von Datenbanken in der Cloud ermöglicht. Dabei lassen sich vollständige Datenbanken wie auch einzelne Tabellen ganz oder teilweise in die Azure DB auslagern, ohne dass sich auf Abfrageseite etwas ändert. Abfragen an eine solche Tabelle werden automatisch vom Cross Platform Query Optimizer angepasst, sodass Teile lokal und Teile in der Cloud ausgeführt werden und das Ergebnis gemeinsam zurück geliefert wird.

Eine Möglichkeit von StretchDB besteht zum Beispiel darin, historische Daten („Cold Data“), die man kaum nutzt, in die Cloud zu verschieben, während aktuelle Daten („Hot Data“) On-Premise vorgehalten werden. So wird die On-Premise-Datenbank entlastet und dennoch bleiben auch die historischen Daten permanent im direkten Zugriff.

Historische Daten mit StretchDB auslagern

Im Folgenden ein konkretes Beispiel für die Auslagerung historischer Daten mit Stretch DB. Wir erzeugen zunächst eine Tabelle:

CREATE TABLE dbo.stammdaten
(
id int identity(1,1),
name nvarchar(50),
vorname nvarchar(50),
jahr int
)

Diese befüllen wir mit 1.000.000 zufälligen Daten:

with f10 AS
(
SELECT * FROM
( VALUES
  (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)
) AS B (f)
)
, f1000 AS
(
SELECT
f = a.f+b.f*10+c.f*100
FROM f10 a
CROSS JOIN f10 b
CROSS JOIN f10 c
)
, f1000000 AS
(
SELECT
f= a.f + b.f*1000
FROM f1000 a
CROSS JOIN f1000 b
)
INSERT INTO dbo.stammdaten
(name, vorname, jahr)
SELECT
nachname = NCHAR(CAST(65+26 * RAND( ABS(CHECKSUM(CAST(NEWID() AS VARCHAR(100)))) ) AS INT))
+ NCHAR(CAST(65+26 * RAND( ABS(CHECKSUM(CAST(NEWID() AS VARCHAR(100)))) ) AS INT))
+ NCHAR(CAST(65+26 * RAND( ABS(CHECKSUM(CAST(NEWID() AS VARCHAR(100)))) ) AS INT))
+ NCHAR(CAST(65+26 * RAND( ABS(CHECKSUM(CAST(NEWID() AS VARCHAR(100)))) ) AS INT))
,vorname =
NCHAR(CAST(65+26 * RAND( ABS(CHECKSUM(CAST(NEWID() AS VARCHAR(100)))) ) AS INT))
+ NCHAR(CAST(65+26 * RAND( ABS(CHECKSUM(CAST(NEWID() AS VARCHAR(100)))) ) AS INT))
+ NCHAR(CAST(65+26 * RAND( ABS(CHECKSUM(CAST(NEWID() AS VARCHAR(100)))) ) AS INT))
+ NCHAR(CAST(65+26 * RAND( ABS(CHECKSUM(CAST(NEWID() AS VARCHAR(100)))) ) AS INT))
,jahr = CAST( 2000+16*RAND( ABS(CHECKSUM(CAST(NEWID() AS VARCHAR(100)))) ) AS INT)
FROM f1000000

Das Script erzeugt Daten wie folgt:

clip_image001

Wir wollen nun alle Daten vor 2010 in die Cloud auslagern. Dazu aktivieren wir auf der Datenbank über Tasks die Funktion „Stretch“:

clip_image003

Im folgenden Dialog können wir auswählen, ob eine ganze Tabelle oder Teile ausgelagert werden sollen:

Auslagerung von Daten mit StretchDB

Und nun lässt sich die Regel erstellen, die wir anwenden wollen:

clip_image007

Tabelle auswählen:
clip_image009

Azure konfigurieren:

clip_image011

Abschließen:

clip_image013

Der Assistent erledigt nun alle erforderlichen Schritte:

clip_image015

Im Hintergrund werden nun alle Daten < 2010 Richtung AzureDB verschoben.

Nach der Verteilung machen wir ein COUNT(*) auf die verschiedenen Zeitbereiche:

clip_image018

Der Execution Plan auf diese verteilte Tabelle zeigt uns nun, dass der Query Optimizer die Aufgaben verteilt. Neben den lokalen TableScans fragt er als Remote Query die AzureDB ab.

clip_image020

Fazit:

StretchDB lässt die Grenzen zwischen onPremise und AzureDB verschwinden und ermöglicht eine leicht zu administrierende Erweiterung einer lokalen Datenbank mit den Kapazitäten der Cloud.