Dies ist der zweite Artikel in einer Reihe von Artikeln über SQL Server In-Memory OLTP.
Der Einführungsartikel – SQL Server In-Memory OLTP – stellte kurz die Grundlagen der neuen Hekaton-Engine vor. In diesem Teil konzentrieren wir uns auf die Praxis. Genauer gesagt werden wir sehen, wie man In-Memory-optimierte Datenbanken und Tabellen erstellt und diese mit Hilfe von T-SQL auswertet.
Voraussetzungen für die Verwendung von speicheroptimierten Datenbanken
In-Memory-OLTP wird automatisch mit einer 64-Bit-Enterprise- oder Developer-Edition von SQL Server 2014 oder SQL Server 2016 installiert. Die 32-Bit-Edition von SQL Server stellt keine In-Memory-OLTP-Komponenten bereit.
Wenn Sie also die 64-Bit-Entwickleredition von SQL Server auf Ihrem Computer installiert haben, können Sie damit beginnen, Datenbanken und Datenstrukturen zu erstellen, die speicheroptimierte Daten ohne zusätzliche Einrichtung speichern.
Jede einzelne Datenbank, die speicheroptimierte Tabellen enthalten soll, sollte eine MEMORY_OPTIMIZED_DATA-Dateigruppe enthalten. Diese Dateigruppe enthält einen oder mehrere Container. Jeder einzelne Container speichert Daten und/oder Delta-Dateien. SQL Server verwendet diese Dateien, um die speicheroptimierten Tabellen wiederherzustellen. Container können auf den verschiedenen Disk-Arrays abgelegt werden,
ähnlich wie bei FILESTREAM-Dateigruppen.
Die Syntax zum Erstellen einer speicheroptimierten Dateigruppe ist fast dieselbe wie für eine herkömmliche FILESTREAM-Dateigruppe, mit einigen Unterschieden:
- Für eine Datenbank kann nur eine speicheroptimierte Dateigruppe erstellt werden.
- Die Option CONTAINS MEMORY_OPTIMIZED_DATA muss explizit angegeben werden.
Sie können die Dateigruppe beim Erstellen einer Datenbank erstellen:
CREATE DATABASE InMemoryDemo ON PRIMARY ( NAME = N'InMemoryDemo', FILENAME = N'D:\Data\InMemoryOLTPDemo.mdf' ), FILEGROUP IMOFG CONTAINS MEMORY_OPTIMIZED_DATA ( NAME = N'InMemoryDemo_Data', FILENAME = N'D:\IMOFG\InMemoryDemo_Data.mdf' )
Alternativ können Sie die Dateigruppe MEMORY_OPTIMIZED_DATA zu einer vorhandenen Datenbank hinzufügen und dann Dateien zu dieser Dateigruppe hinzufügen.
-- Adding the containers ALTER DATABASE DemoDB ADD FILE ( NAME = 'DemoDB_Mod', FILENAME = 'D:\Data\DemoDB_Mod' ) TO FILEGROUP DemoDB_Mod
Intern verwendet In-Memory OLTP einen auf der FILESTREAM-Technologie basierenden Streaming-Mechanismus, der für sequenziellen I/O-Zugriff gut geeignet ist.
Speicheroptimierte Tabellen erstellen
Jetzt haben wir alles, was wir brauchen, um mit der Erstellung von speicheroptimierten Objekten zu beginnen. Lassen Sie uns eine speicheroptimierte Tabelle erstellen.
Die Syntax zum Erstellen von In-Memory-optimierten Tabellen ist der zum Erstellen von datenträgerbasierten Tabellen sehr ähnlich. Es gibt jedoch einige Erweiterungen und Einschränkungen:
- Die Klausel MEMORY_OPTIMIZED =ON identifiziert eine Tabelle als speicherintern optimiert.
- In-Memory-optimierte Tabellen unterstützen nicht alle Datentypen, die herkömmliche Tabellen unterstützen. Die folgenden Datentypen werden nicht unterstützt:
- datetimeoffset
- Geographie
- Geometrie
- Hierarchie-ID
- Zeilenversion
- XML
- sql_variante
- Benutzerdefinierte Typen
Eine speicheroptimierte Tabelle kann mit den folgenden Haltbarkeitswerten erstellt werden:SCHEMA_AND_DATA oder SCHEMA_ONLY. SCHEMA_AND_DATA ist der Standardwert.
Falls Sie SCHEMA_ONLY angeben, werden alle Änderungen an der Tabelle nicht protokolliert und die Tabellendaten werden nicht auf der Festplatte gespeichert.
Jede einzelne speicheroptimierte Tabelle muss mindestens einen Index enthalten. Beachten Sie, dass die PRIMARY KEY-Einschränkung implizit einen Index erstellt. Eine dauerhafte speicheroptimierte Tabelle erfordert immer eine PRIMARY KEY-Einschränkung.
CREATE TABLE dbo.Person ( [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED ,[City] VARCHAR(32) NULL ,[Country] VARCHAR(32) NULL ,[State_Province] VARCHAR(32) NULL ,[LastModified] DATETIME NOT NULL ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
Zusammengesetzte Indizes können hinzugefügt werden, wenn alle Spalten erstellt wurden:
CREATE TABLE dbo.Person ( [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED ,[City] VARCHAR(32) NULL ,[Country] VARCHAR(32) NULL ,[State_Province] VARCHAR(32) NULL ,[LastModified] DATETIME NOT NULL ,INDEX T1_INDX_C1C2 NONCLUSTERED ([Name], [City]) ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
Wenn Sie die In-Memory-optimierte Tabelle erstellen, erstellt die In-Memory-OLTP-Engine DML-Routinen, um auf diese Tabelle zugreifen zu können. Es lädt Routinen als DLL-Dateien. Für einen bestimmten Vorgang ruft SQL Server eine erforderliche DLL-Datei auf.
Ändern von Tabellen und Indizes
Vor SQL Server 2016 war es unmöglich, Tabellen zu ALTEREN. Um Schemaänderungen vorzunehmen, mussten Sie die In-Memory-Tabelle löschen und neu erstellen.
In der neuen Version von SQL Server wird ALTER TABLE teilweise unterstützt.
SQL Server 2016 bietet Ihnen die Möglichkeit, Offline-Vorgänge durchzuführen:Hinzufügen und Löschen (Ändern) von Spalten, Indizes und Einschränkungen. Außerdem ist es jetzt möglich, mithilfe des SSMS-Tabellen-Designers oder des dbForge Studio for SQL Server-Tabelleneditors mit In-Memory-Tabellen zu arbeiten.
Beachten Sie, dass ALTER TABLE eine Neuerstellung der Tabelle erfordert. Aus diesem Grund müssen Sie sicherstellen, dass Sie über genügend Arbeitsspeicher verfügen, bevor Sie diesen Vorgang ausführen. Während des Neuerstellungsvorgangs wird jede einzelne Zeile erneut in die neue Tabelle eingefügt, und die Tabelle ist nicht verfügbar, während der ALTER-Vorgang ausgeführt wird.
Sie können mehrere Änderungen an einer einzelnen Tabelle vornehmen und sie in einer einzigen ALTER TABLE-Anweisung kombinieren. Sie können Spalten, Indizes und Einschränkungen HINZUFÜGEN und Spalten, Indizes und Einschränkungen DROPEN. Beachten Sie, dass Sie ADD- und DROP-Befehle nicht in einer einzigen ALTER TABLE kombinieren können.
-- index operations -- change hash index bucket count ALTER TABLE dbo.TableName ALTER INDEX IX_Name REBUILD WITH (BUCKET_COUNT = 131072); GO -- add index ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName); GO -- drop index ALTER TABLE dbo.TableName DROP INDEX IX_Name; GO -- add multiple indexes ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName), INDEX IX_Name2 NONCLUSTERED (ColName2); GO -- Add a new column and an index ALTER TABLE dbo.TableName ADD Date DATETIME, INDEX IX_Name NONCLUSTERED (ColName); GO -- Drop a column ALTER TABLE dbo.TableName DROP COLUMN ColName; GO
Tabellentypen und Tabellenvariablen
SQL Server 2016 bietet Ihnen die Möglichkeit, speicheroptimierte Tabellentypen zu erstellen, die Sie beim Definieren einer Tabellenvariablen verwenden können:
CREATE TYPE TypeName AS TABLE ( Col1 SMALLINT NOT NULL, Col2 INT NOT NULL, Col3 INT NOT NULL, Col4 INT NOT NULL, INDEX IX_Col1 NONCLUSTERED HASH (Col1) WITH (BUCKET_COUNT = 131072), INDEX IX_Col1 NONCLUSTERED (Col2)) WITH (MEMORY_OPTIMIZED = ON); GO DECLARE @VariableName TypeName; GO
Diese Variable wird nur im Speicher gespeichert. In-Memory-optimierte Tabellen und Tabellentypen verwenden dieselben Datenstrukturen, sodass der Datenzugriff im Vergleich zu festplattenbasierten Tabellenvariablen effizienter ist.
Weitere Einzelheiten finden Sie im folgenden MSDN-Blogbeitrag:Improving temp table and table variable performance using memory optimize
Zusammenfassung
Das In-Memory OLTP ist eine relativ junge Technologie, die entwickelt wurde, um mit riesigen und sehr ausgelasteten OLTP-Systemen zu arbeiten, die Hunderte oder sogar Tausende von gleichzeitigen Benutzern unterstützen. Es wurde in SQL Server 2014 eingeführt und in SQL Server 2016 weiterentwickelt.
Gleichzeitig enthält die Technologie eine Reihe von Einschränkungen und Beschränkungen.
Nicht alle T-SQL-Funktionen und -Datentypen werden vom Speicher unterstützt. optimierte Tabellen, solche Tabellen dürfen keine Zeilen enthalten, die 8060 Bytes überschreiten, und unterstützen auch nicht
ROW-OVERFLOW und LOB-Speicher. Sie können Tabellen und Indizes (in SQL Server 2014) nicht mehr ändern, sobald die Tabelle erstellt wurde.
Trotzdem erwarten wir, dass weitere Versionen von In-Memory OLTP weniger Einschränkungen haben werden!
Lesen Sie auch:
Verwenden von Indizes in speicheroptimierten SQL Server-Tabellen