Planen der Übernahme von In-Memory-OLTP-Funktionen in SQL ServerPlan your adoption of In-Memory OLTP Features in SQL Server

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL DatabaseAnwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database

Dieser Artikel beschreibt, auf welche Weise sich die Übernahme von In-Memory-Funktionen auf andere Aspekte Ihres Geschäftssystems auswirkt.This article describes the ways in which the adoption of In-Memory features affects other aspects of your business system.

A.A. Übernahme von In-Memory-OLTP-FunktionenAdoption of In-Memory OLTP features

In den folgenden Unterabschnitten werden die Faktoren erläutert, die Sie berücksichtigen müssen, wenn Sie planen, In-Memory-Funktionen zu übernehmen und zu implementieren.The following subsections discuss factors you must consider when you plan to adopt and implement In-Memory features. Viele erläuternde Informationen finden Sie unter:A lot of explanatory information is available at:

A.1 Erforderliche KomponentenA.1 Prerequisites

Eine erforderliche Komponente für die Verwendung der In-Memory-Funktionen kann die Edition oder Dienstebene des SQL-Produkts umfassen.One prerequisite for using the In-Memory features can involve the edition or service tier of the SQL product. Diese und andere erforderliche Komponenten finden Sie unter:For this and other prerequisites, see:

A.2 Prognose der Menge an aktivem ArbeitsspeicherA.2 Forecast the amount of active memory

Verfügt Ihr System über genügend Arbeitsspeicher zur Unterstützung einer neuen speicheroptimierten Tabelle?Does your system have enough active memory to support a new memory-optimized table?

Microsoft SQL ServerMicrosoft SQL Server

Eine speicheroptimierte Tabelle mit 200 GB Daten erfordert mehr als 200 GB aktiven Arbeitsspeicher für deren Unterstützung.A memory-optimized table which contains 200 GB of data requires more than 200 GB of active memory be dedicated to its support. Vor der Implementierung einer speicheroptimierten Tabelle, die eine große Datenmenge enthält, müssen Sie die Menge an zusätzlichem aktiven Arbeitsspeicher prognostizieren, den Sie Ihrem Servercomputer möglicherweise hinzufügen müssen.Before you implement a memory-optimized table containing a large amount of data, you must forecast the amount of additional active memory you might need to add to your server computer. Einen Leitfaden für die Schätzung finden Sie unter:For estimation guidance, see:

Azure SQL-DatenbankAzure SQL Database

Bei einer Datenbank, die im Clouddienst von Azure SQL-Datenbank gehostet wird, wirkt sich die ausgewählte Dienstebene auf die Menge an aktivem Arbeitsspeicher aus, die Ihre Datenbank verwenden darf.For a database hosted in the Azure SQL Database cloud service, your chosen service tier affects the amount of active memory your database is allowed to consume. Sie sollten planen, die Speicherverwendung Ihrer Datenbank mithilfe einer Warnung zu überwachen.You should plan to monitor the memory usage of your database by using an alert. Einzelheiten dazu finden Sie unter:For details, see:

Speicheroptimierte TabellenvariablenMemory-optimized table variables

Eine Tabellenvariable, die als speicheroptimiert gilt, wird manchmal vor einer herkömmlichen #TempTable bevorzugt, die sich in der Datenbank tempdb befindet.A table variable which is declared to be memory-optimzed is sometimes a preferable to a traditional #TempTable that resides in the tempdb database. Solche Tabellenvariablen können ohne das Verwenden signifikanter Mengen an aktivem Arbeitsspeicher erhebliche Leistungssteigerungen bieten.Such table variables can provide significant performance gains without using significant amounts of active memory.

A.3 Die Tabelle muss offline sein, um in „speicheroptimiert“ konvertiert zu werdenA.3 Table must be offline to convert to memory-optimized

Einige Funktionen von ALTER TABLE sind für speicheroptimierte Tabellen verfügbar.Some ALTER TABLE functionality is available for memory-optimized tables. Sie können jedoch keine ALTER TABLE-Anweisung ausgeben, um eine datenträgerbasierte Tabelle in eine speicheroptimierte Tabelle zu konvertieren.But you cannot issue an ALTER TABLE statement to convert a disk-based table into a memory-optimized table. Stattdessen müssen Sie eine manuellere Vorgehensweise verwenden.Instead you must use a more manual set of steps. Im Folgenden werden verschiedene Methoden zum Konvertieren Ihrer datenträgerbasierenden Tabelle in eine speicheroptimierte Tabelle beschrieben.What follows are various ways you can convert your disk-based table to be memory-optimized.

Manuelle SkripterstellungManual scripting

Eine Möglichkeit, Ihre datenträgerbasierte Tabelle in eine speicheroptimierte Tabelle zu konvertieren, besteht darin, die erforderlichen Transact-SQL-Schritte selbst zu codieren.One way to convert your disk-based table to a memory-optimized table is to code the necessary Transact-SQL steps yourself.

  1. Halten Sie die Aktivität der Anwendung an.Suspend application activity.

  2. Führen Sie eine vollständige Sicherung durch.Take a full backup.

  3. Benennen Sie Ihre datenträgerbasierte Tabelle um.Rename your disk-based table.

  4. Geben Sie eine CREATE TABLE-Anweisung aus, um Ihre neue speicheroptimierte Tabelle zu erstellen.Issue a CREATE TABLE statement to create your new memory-optimized table.

  5. Wählen Sie mithilfe einer untergeordneten SELECT-Anweisung Teilmengen aus Ihrer datenträgerbasierten Tabelle aus, um diese mithilfe von INSERT INTO in Ihre speicheroptimierte Tabelle einzufügen.INSERT INTO your memory-optimized table with a sub-SELECT from the disk-based table.

  6. Führen Sie die DROP-Anweisung für Ihre datenträgerbasierte Tabelle aus.DROP your disk-based table.

  7. Führen Sie eine weitere vollständige Sicherung durch.Take another full backup.

  8. Setzen Sie die Aktivität der Anwendung fort.Resume application activity.

Ratgeber für die SpeicheroptimierungMemory Optimization Advisor

Das Tool „Ratgeber für die Speicheroptimierung“ kann ein Skript generieren, um bei der Implementierung der Umkehrung einer datenträgerbasierten Tabelle in eine speicheroptimierte Tabelle zu helfen.The Memory Optimization Advisor tool can generate a script to help implement the conversion of a disk-based table to a memory-optimized table. Das Tool ist als Teil der SQL Server Data Tools (SSDT) installiert.The tool is installed as part of SQL Server Data Tools (SSDT).

DACPAC-Datei.dacpac file

Sie können Ihre Datenbank direkt mithilfe einer von SSDT verwalteten DACPAC-Datei aktualisieren.You can update your database in-place by using a .dacpac file, managed by SSDT. In SSDT können Sie Änderungen an dem Schema angeben, das in der DACPAC-Datei codiert ist.In SSDT you can specify changes to the schema that is encoded in the .dacpac file.

Sie arbeiten mit DACPAC-Dateien im Kontext eines Visual Studio-Projekts vom Typ Datenbank.You work with .dacpac files in the context of a Visual Studio project of type Database.

A.4 Leitfaden, um herauszufinden, ob In-Memory-OLTP-Funktionen für Ihre Anwendung geeignet sindA.4 Guidance for whether In-Memory OLTP features are right for your application

Einen Leitfaden, um herauszufinden, ob In-Memory-OLTP-Funktionen die Leistung Ihrer bestimmten Anwendung verbessern können, finden Sie unter:For guidance on whether In-Memory OLTP features can improve the performance of your particular application, see:

B.B. Nicht unterstützte FunktionenUnsupported features

Funktionen, die in bestimmten In-Memory-OLTP-Szenarios nicht unterstützt werden, werden in folgendem Artikel beschrieben:Features which are not supported in certain In-Memory OLTP scenarios are described at:

In den folgenden Unterabschnitten werden einige der wichtigeren, nicht unterstützten Funktionen hervorgehoben.The following subsections highlight some of the more important unsupported features.

B.1 SNAPSHOT einer DatenbankB.1 SNAPSHOT of a database

Nachdem eine speicheroptimierte Tabelle oder ein speicheroptimiertes Modul zum ersten Mal in einer gegebenen Datenbank erstellt wurde, kann niemals ein SNAPSHOT (Momentaufnahme) der Datenbank erstellt werden.After the first time that any memory-optimized table or module is created in a given database, no SNAPSHOT of the database can ever be taken. Der spezifische Grund dafür ist der folgende:The specific reason is that:

  • Das erste speicheroptimierte Element macht es unmöglich, die letzte Datei der speicheroptimierten FILEGROUP je zu verwerfen, undThe first memory-optimized item makes it impossible to ever drop the last file from the memory-optimized FILEGROUP; and
  • keine Datenbank, die eine Datei in der speicheroptimierten FILEGROUP hat, kann einen SNAPSHOT unterstützen.No database that has a file in a memory-optimized FILEGROUP can support a SNAPSHOT.

Normalerweise kann ein SNAPSHOT für schnelle Testiterationen praktisch sein.Normally a SNAPSHOT can be handy for quick testing iterations.

B.2 Datenbankübergreifende AbfragenB.2 Cross-database queries

Speicheroptimierte Tabellen bieten keine Unterstützung für datenbankübergreifende Transaktionen.Memory-optimized tables do not support cross-database transactions. Innerhalb einer Transaktion oder Abfrage, die auf eine speicheroptimierte Tabelle zugreift, können Sie nicht gleichzeitig auf eine andere Datenbank zugreifen.You cannot access another database from the same transaction or the same query that also accesses a memory-optimized table.

Tabellenvariablen sind nicht transaktional.Table variables are not transactional. Aus diesem Grund können speicheroptimierte Tabellenvariablen in datenbankübergreifenden Abfragen verwendet werden.Therefore, memory-optimized table variables can be used in cross-database queries.

B.3 READPAST-TabellenhinweisB.3 READPAST table hint

Keine Abfrage kann den READPAST- Tabellenhinweis auf speicheroptimierte Tabellen anwenden.No query can apply the READPAST table hint to any memory-optimized table.

Der READPAST-Hinweis ist hilfreich bei Szenarios, in denen mehrere Sitzungen jeweils auf den gleichen Satz von Zeilen zugreifen und diesen bearbeiten, sowie bei der Verarbeitung einer Warteschlange.The READPAST hint is helpful in scenarios where several sessions are each accessing and modifying the same small set of rows, such as in processing a queue.

B.4 RowVersion, SequenceB.4 RowVersion, Sequence

  • In einer speicheroptimierten Tabelle kann keine Spalte für RowVersion markiert werden.No column can be tagged for RowVersion on a memory-optimized table.

  • Ein SEQUENCE -Objekt kann nicht mit einer Einschränkung in speicheroptimierten Tabelle verwendet werden.A SEQUENCE cannot be used with a constraint in a memory-optimized table. Sie können keine z.B. keine DEFAULT-Einschränkung mit einer NEXT VALUE FOR-Klausel erstellen.For example, you cannot create a DEFAULT constraint with a NEXT VALUE FOR clause. SEQUENCE-Anweisungen können mit INSERT- und UPDATE-Anweisungen verwendet werden.SEQUENCEs can be used with INSERT and UPDATE statements.

C.C. Administrative WartungAdministrative maintenance

Dieser Abschnitt beschreibt die Unterschiede in der Datenbankverwaltung bei der Verwendung von speicheroptimierten Tabellen.This section describes differences in database administration where memory-optimized tables are used.

C.1 Zurücksetzen des ID-Startwerts, Inkrementwert > 1C.1 Identity seed reset, increment > 1

DBCC CHECKIDENT, um den Startwert einer IDENTITY-Spalte zu korrigieren, kann nicht für eine speicheroptimierte Tabelle verwendet werden.DBCC CHECKIDENT, to reseed an IDENTITY column, cannot be used on a memory-optimized table.

Der Inkrementwert wird für eine IDENTITÄTSSPALTE in einer speicheroptimierten Tabelle auf genau 1 beschränkt.The increment value is restricted to exactly 1 for an IDENTITY column on a memory-optimized table.

C.2 DBCC CHECKDB kann keine speicheroptimierten Tabellen überprüfenC.2 DBCC CHECKDB cannot validate memory-optimized tables

Der Befehl DBCC CHECKDB tut nichts, wenn sein Ziel eine speicheroptimierte Tabelle ist.The DBCC CHECKDB command does nothing when its target is a memory-optimized table. Dies können Sie mithilfe der folgenden Schritte umgehen:The following steps are a work-around:

  1. Sichern Sie das Transaktionsprotokoll.Back up the transaction log.

  2. Sichern Sie die Dateien in der speicheroptimierten FILEGROUP auf einem NULL-Gerät.Back up the files in the memory-optimized FILEGROUP to a null device. Der Sicherungsvorgang ruft die Prüfsummenverifizierung auf.The backup process invokes a checksum validation.

    Wenn eine Beschädigung gefunden wird, fahren Sie mit den nächsten Schritten fort.If corruption is found, proceed with the next steps.

  3. Kopieren Sie Daten aus Ihren speicheroptimierten Tabellen in datenträgerbasierte Tabellen für die temporäre Speicherung.Copy data from your memory-optimized tables into disk-based tables, for temporary storage.

  4. Stellen Sie die Dateien der speicheroptimierten FILEGROUP wieder her.Restore the files of the memory-optimized FILEGROUP.

  5. Fügen Sie die Daten, die Sie in den datenträgerbasierten Tabellen temporär gespeichert haben, mithilfe der INSERT INTO-Anweisung in die speicheroptimierten Tabellen ein.INSERT INTO the memory-optimized tables the data you temporarily stored in the disk-based tables.

  6. Führen Sie eine DROP-Anweisung auf die datenträgerbasierten Tabellen aus, in denen die Daten temporär gespeichert waren.DROP the disk-based tables which temporarily held the data.

D:D. LeistungPerformance

Dieser Abschnitt beschreibt Situationen, in denen die ausgezeichnete Leistung von speicheroptimierten Tabellen unterhalb des Gesamtpotenzials bleiben kann.This section describes situations where the excellent performance of memory-optimized tables can be held below full potential.

D.1 Index-ÜberlegungenD.1 Index considerations

Alle Indizes für eine speicheroptimierte Tabelle werden von den tabellenbezogenen Anweisungen CREATE TABLE und ALTER TABLE erstellt und verwaltet.All indexes on a memory-optimized table are created and managed by the table-related statements CREATE TABLE and ALTER TABLE. Sie können keine CREATE INDEX-Anweisung auf speicheroptimierte Tabellen anwenden.You cannot target a memory-optimized table with a CREATE INDEX statement.

Der herkömmliche nicht gruppierte Index in B-Struktur ist häufig die sinnvolle und einfache Wahl, wenn Sie zum ersten Mal eine speicheroptimierte Tabelle implementieren.The traditional b-tree nonclustered index is often the sensible and simple choice when you first implement a memory-optimized table. Später, nachdem Sie gesehen haben, wie Ihre Anwendung ausgeführt wird, können Sie in Betracht ziehen, zu einem anderen Indextyp zu wechseln.Later, after you see how your application performs, you can consider swapping another index type.

Zwei besondere Indextypen erfordern im Kontext einer speicheroptimierten Tabelle eine Erläuterung: Hashindizes und Columnstore-Indizes.Two special types of indexes need discussion in the context of a memory-optimized table: Hash indexes, and Columnstore indexes.

Eine Übersicht über Indizes bei speicheroptimierten Tabellen finden Sie unter:For an overview of indexes on memory-optimized tables, see:

HashindizesHash indexes

Hashindizes können das schnellste Format darstellen, um auf eine bestimmte Zeile mit ihrem exakten Primärschlüssel zuzugreifen, indem der „ = “-Operator verwendet wird.Hash indexes can be the fastest format for accessing one specific row by its exact primary key value by using the '=' operator.

  • Ungenaue Operatoren, z.B. „ != “, „ > “ oder „BETWEEN“ würden die Leistung beeinträchtigen, wenn Sie mit einem Hashindex verwendet werden.Inexact operators such as '!=', '>', or 'BETWEEN' would harm performance if used with a hash index.

  • Ein Hashindex stellt möglicherweise nicht die beste Wahl dar, wenn die Rate der Schlüsselwertduplizierung zu hoch wird.A hash index might not be the best choice if the rate of key value duplication becomes too high.

  • Schützen Sie sich vor der Unterschätzung, wie viele Buckets Ihr Hashindex benötigen könnte, um lange Ketten innerhalb einzelner Buckets zu vermeiden.Guard against underestimating how many buckets your hash index might need, to avoid long chains within individual buckets. Einzelheiten dazu finden Sie unter:For details, see:

Nicht gruppierte Columnstore-IndizesNonclustered columnstore indexes

Speicheroptimierte Tabellen bieten einen hohen Durchsatz von typischen Geschäftstransaktionsdaten, die wir im Paradigma als Onlinetransaktionsverarbeitung oder OLTP bezeichnen.Memory-optimized tables deliver high throughput of typical business transactional data, in the paradigm we call online transaction processing or OLTP. Columnstore-Indizes bieten einen hohen Durchsatz von Aggregationen und ähnlichen Verarbeitungen, die wir als Analysen bezeichnen.Columnstore indexes deliver high throughput of aggregations and similar processing we call Analytics. In den vergangenen Jahren bestand die bestmögliche Methode, dem Bedarf von sowohl OLTP als auch Analysen gerecht zu werden, darin, über getrennte Tabellen mit intensiver Datenverschiebung und mit einem gewissen Grad an Datenduplizierung zu verfügen.In years past the best approach available for satisfying the needs of both OLTP and Analytics was to have separate tables with heavy movement of data, and with some degree of data duplication. Heutzutage ist eine einfachere Hybridlösung verfügbar, und zwar das Verfügen über einen Columnstore-Index in einer speicheroptimierten Tabelle.Today a simpler hybrid solution is available: have a columnstore index on a memory-optimized table.

  • Ein Columnstore-Index kann in einer datenträgerbasierten Tabelle erstellt werden, sogar als gruppierter Index.A columnstore index can be built on a disk-based table, even as the clustered index. In einer speicheroptimierten Tabelle kann ein Columnstore-Index jedoch nicht gruppiert werden.But on a memory-optimized table a columnstore index cannot be clustered.

  • LOB-Spalten oder Spalten außerhalb von Zeilen verhindern in einer speicheroptimierten Tabelle die Erstellung eines Columnstore-Indizes in der Tabelle.LOB or off-row columns for a memory-optimized table prevent the creation of a columnstore index on the table.

  • Es kann keine ALTER TABLE-Anweisung auf eine speicheroptimierte Tabelle ausgeführt werden, während ein Columnstore-Index in der Tabelle vorhanden ist.No ALTER TABLE statement can be executed against a memory-optimized table while a columnstore index exists on the table.

    • Ab August 2016 plant Microsoft kurzfristig, die Leistung bei der Neuerstellung des Columnstore-Indizes zu verbessern.As of August 2016, Microsoft has near-term plans to improve the performance of re-creating the columnstore index.

D.2 LOB-Spalten und Spalten außerhalb von ZeilenD.2 LOB and off-row columns

Large Objects (LOBs) sind Spalten von z.B. dem Typ varchar (max).Large objects (LOBs) are columns of such types as varchar(max). Das Verfügen über eine Reihe von LOB-Spalten in einer speicheroptimierten Tabelle beeinträchtigt die Leistung wahrscheinlich nicht so sehr, dass es eine Rolle spielt.Having a couple of LOB columns on a memory-optimized table probably does not harm performance enough to matter. Verhindern Sie jedoch, mehr LOB-Spalten zu haben, als Ihre Daten benötigen.But do avoid having more LOB columns than your data needs. Der gleiche Rat gilt für Spalten außerhalb von Zeilen.The same advice applies to off-row columns. Definieren Sie eine Spalte nicht als nvarchar(3072), wenn varchar(512) ausreichen würde.Do not define a column as nvarchar(3072) if varchar(512) will suffice.

Weitere Informationen zu LOB-Spalten und Spalten außerhalb von Zeilen finden Sie unter:A bit more about LOB and off-row columns is available at:

E.E. Einschränkungen von nativen ProzedurenLimitations of native procs

Bestimmte Elemente von Transact-SQL werden in nativ kompilierten T-SQL-Modulen, einschließlich gespeicherten Prozeduren, nicht unterstützt.Particular elements of Transact-SQL are not supported in natively compiled T-SQL modules, including stored procedures. Weitere Informationen darüber, welche Funktionen unterstützt werden, finden Sie im folgenden Artikel:For details about which features are supported, see:

Überlegungen zur Migration eines Transact-SQL-Moduls, das nicht unterstützte Features verwendet, zu einem nativ kompilierten Transact-SQL-Modul, werden im folgenden Artikel erläutert:For considerations when migrating a Transact-SQL modules that uses unsupported features to natively compiled, see:

Neben Einschränkungen für bestimmte Elemente von Transact-SQL gibt es auch Einschränkungen für Abfrageoperatoren, die in nativ kompilierten T-SQL-Modulen unterstützt werden.Besides limitations on certain elements of Transact-SQL, there are also limitation on query operators supported in natively compiled T-SQL modules. Aufgrund dieser Einschränkungen eignen sich nativ kompilierte gespeicherte Prozeduren nicht für analytische Abfragen, die große Datasets verarbeiten.Because of these limitations, natively compiled stored procedures are not suitable for analytical queries that process large data sets.

Keine parallele Verarbeitung in einer nativen ProzedurNo parallel processing in a native proc

Die Parallele Verarbeitung kann nicht Teil eines Abfrageplans für eine native Prozedur sein.Parallel processing cannot be a part of any query plan for a native proc. Native Prozeduren sind immer auf einen Thread beschränkt.Native procs are always single-threaded.

Join-TypenJoin types

Weder ein Hashjoin noch ein Zusammenführungsjoin kann Teil eines Abfrageplans für eine native Prozedur sein.Neither a hash join nor a merge join can be a part of any query plan for a native proc. Joins geschachtelter Schleifen werden verwendet.Nested loop joins are used.

Keine HashaggregationNo hash aggregation

Wenn der Abfrageplan für eine native Prozedur eine Aggregationsphase erfordert, steht nur die Stream-Aggregation zur Verfügung.When the query plan for a native proc requires an aggregation phase, only stream aggregation is available. Die Hashaggregation wird in einem Abfrageplan für eine native Prozedur nicht unterstützt.Hash aggregation is not supported in a query plan for a native proc.

  • Die Hashaggregation ist besser, wenn Daten aus einer großen Anzahl von Zeilen aggregiert werden müssen.Hash aggregation is better when data from a large number of rows must aggregated.

F.F. Anwendungsentwurf: Transaktionen und WiederholungslogikApplication design: Transactions and retry logic

Eine Transaktion, die eine speicheroptimierte Tabelle umfasst, kann von einer anderen Transaktion abhängig werden, die die gleiche Tabelle umfasst.A transaction involving a memory-optimized table can become dependent on another transaction which involves the same table. Wenn die Anzahl von abhängigen Transaktionen den zulässigen Höchstwert überschreitet, tritt bei allen abhängigen Transaktionen ein Fehler auf.If the count of dependent transactions reaches exceeds the allowed maximum, all the dependent transactions fail.

Bei SQL Server 2016:In SQL Server 2016:

  • beträgt das zulässige Maximum acht abhängige Transaktionen.The allowed maximum is 8 dependent transactions. Acht ist auch der Grenzwert von Transaktionen, von denen alle gegebenen Transaktionen abhängig sein können.8 is also the limit of transactions that any given transaction can be dependent on.
  • ist die Fehlernummer 41839The error number is 41839. (In SQL Server 2014 ist die Fehlernummer 41301).(In SQL Server 2014 the error number is 41301.)

Sie können die Transact-SQL-Skripts stabiler gegenüber einem möglichen Transaktionsfehler machen, indem Sie die Wiederholungslogik zu Ihren Skripts hinzufügen.You can make your Transact-SQL scripts more robust against a possible transaction error by adding retry logic to your scripts. Die Wiederholungslogik hilft mit größerer Wahrscheinlichkeit, wenn UPDATE- und DELETE-Aufrufe häufig sind, oder wenn durch einen Fremdschlüssel in einer anderen Tabelle auf die speicheroptimierte Tabelle verwiesen wird.Retry logic is more likely to help when UPDATE and DELETE calls are frequent, or if the memory-optimized table is referenced by a foreign key in another table. Einzelheiten dazu finden Sie unter:For details, see: