Memory-Optimized Table

Eintrag zuletzt aktualisiert am: 18.10.2017

Die größte Neuerung in Version 2014 ist die unter dem Code-Namen „Hekaton“ erstmal auf dem PASS Summit 2012 in Seattle angekündigte komplett neue Storage-Engine, die Microsoft nun Extreme Transactional Processing (XTP) und In-Memory OLTP nennt.

XTP ermöglich als Alternative zu den herkömmlichen Tabellen nun auch sogenannte „speicheroptimierte Tabellen“ (Memory-Optimized Tables). Der primäre Speicherort dieser Tabellen ist das RAM des Datenbankservers. Alle Lese- und Speicheroperationen finden primär im Hauptspeicher statt und sind entsprechend performant. Gleichwohl persistiert der SQL Server eine Kopie der Daten auf dauerhaften Speichermedien. In speziellen Szenarien (z.B. Sitzungszustand in Websites) besteht auch die Möglichkeit, komplett auf die Datenspeicherung auf Festplatte zu verzichten. Für solche „Schema-Only“-definierten Tabellen finden keine I/O-Operationen mehr statt.

Eine speicheroptimierte Tabelle erzeugt der Nutzer mit den Zusätzen CONTAINS MEMORYOPTIMIZED_DATA beim Erstellen mit einer Filegroup und WITH (MEMORYOPTIMIZED=ON) beim Anlegen einer Datenbanktabelle. Um auf diese Tabellen zuzugreifen, ist häufig keine Änderung in der Anwendung erforderlich. Bestehende SQL-Datenzugriffsanweisungen funktionieren wie bisher, solange die Tabellenstruktur sich nicht ändert. Eine Änderung der Tabellenstruktur kann aber notwendig sein, da nicht alle Datentypen und Eigenschaften beim In-Memory-OLTP verfügbar sind. Das gilt zum Beispiel für den XML-Spaltentyp sowie die Geodaten-Typen GEOMETRY und GEOGRAPHY.

Solche speicheroptimierten Tabellen können auch für Variablen in SQL-Skripten und als Tabellenwertparameter für Stored Procedures zum Einsatz kommen. Speicheroptimierte Tabellen bieten zwei neue Index-Typen: Hash-Indexe und Range-Indexe, die auf einem Bw-Tree basieren. Eine spezielle Eigenart dieser beiden Index-Typen ist, das SQL Server diese abseits ihrer Definition niemals auf der Festplatte speichert und somit das I/O-Subsystem wesentlich entlasten. Für weitere Optimierungen im I/O-Bereich sorgt der ausschließlich sequentielle Zugriff auf die neuen Datenstrukturen – im Gegensatz zu dem sonst bekannten Random Access auf Datendateien. Das vereinfacht die Optimierung des darunterliegenden Storagesystems wesentlich.

Verbesserungen in SQL Server 2017

Seit SQL Server 2014 bietet SQL Server sogenannte Memory-Optimized Tables. In SQL Server 2017 nun kann der Entwickler hierbei auch berechnete Spalten verwenden. Auch die Verwendung der Funktion IsJSON() in Constraints ist in Memory-Optimized Tables jetzt erlaubt, um durchzusetzen, dass eine Zeichenkettenspalte gültige JSON-Daten enthält (siehe Listing).

n dieser Memory-Optimized Table ist DetailsJSON eine JSON-Spalte und AlleDaten eine berechnete Spalte:

CREATE TABLE [dbo].[Kunde](
[ID] [int] NOT NULL,
[Kundenname] [nvarchar](50) NULL,
[Datum] [datetime2](7) NULL,
[DetailsJSON] nvarchar(4000),
AlleDaten AS concat_ws(';',[ID],[Kundenname],[DATUM]) PERSISTED,
CONSTRAINT [PK_Kunden] PRIMARY KEY NONCLUSTERED ([ID] ASC),
CONSTRAINT [DetailsJSON should be formatted as JSON]
CHECK (ISJSON([DetailsJSON])=1),
)
WITH (MEMORY_OPTIMIZED=ON )
GO